Spring 数据 JpaRepository saveAndFlush 在 @Transactional 测试方法中不起作用
Spring Data JpaRepository saveAndFlush not working in @Transactional test method
使用 JPA Spring 数据我创建了几个实体 Ebook 和 Review,它们通过从 Review 到 Ebook 的 ManyToOne 关系链接。我试图插入对现有电子书的评论,但结果没有反映在数据库(Postgres DB)中,即使我在 @Transactional 中使用 saveAndFlush。我正确地检索了插入的评论,只是没有在 table.
中保存记录
实体:
电子书:
@Entity
public class Ebook {
@Id
@SequenceGenerator(
name="ebook_sequence",
sequenceName = "ebook_sequence",
allocationSize = 1
)
@GeneratedValue (
strategy = GenerationType.SEQUENCE,
generator ="ebook_sequence"
)
private Long idEbook;
private String title;
}
评论:
@Entity
public class Review {
@Id
@SequenceGenerator(
name="sequence_review",
sequenceName = "sequence_review",
allocationSize = 1
)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence_review"
)
private Long idReview;
private String reviewText;
//ManytoOne Ebook
@ManyToOne(
cascade = CascadeType.ALL,
fetch = FetchType.LAZY
)
@JoinColumn(
name = "id_ebook",
referencedColumnName = "idEbook"
)
private Ebook ebook;
}
我试图插入与现有电子书记录相对应的评论的测试:
@Test
@Transactional
public void saveReviewWithEbook() {
Ebook ebook = ebookRepository.getById((long)1);
Review review = Review.builder()
.reviewText("review text ebook 1")
.ebook(ebook)
.build();
Review reviewInserted = reviewRepository.saveAndFlush(review); //saveAndFlush(review);
Review reviewLoaded = reviewRepository.getById(reviewInserted.getIdReview());
System.out.println("reviewLoaded = " + reviewLoaded);
}
执行后,table'review'中没有插入记录,虽然变量'reviewLoaded'中数据正确显示。这是为什么?如何只保存与现有电子书对应的评论?
为测试打开的事务在测试方法结束时回滚。
这可以被禁用:
@Rollback(false) // <-- !
@Test
public void myTest()
Spring boot test @Transactional not saving
另请注意,ORM(例如 Hibernate)可能会有一些缓存,这可以防止在事务中查询已知实体时实际访问数据库。
因此,要测试实体的成功持久性,最好在单独的事务中测试检索。
使用 JPA Spring 数据我创建了几个实体 Ebook 和 Review,它们通过从 Review 到 Ebook 的 ManyToOne 关系链接。我试图插入对现有电子书的评论,但结果没有反映在数据库(Postgres DB)中,即使我在 @Transactional 中使用 saveAndFlush。我正确地检索了插入的评论,只是没有在 table.
中保存记录实体:
电子书:
@Entity
public class Ebook {
@Id
@SequenceGenerator(
name="ebook_sequence",
sequenceName = "ebook_sequence",
allocationSize = 1
)
@GeneratedValue (
strategy = GenerationType.SEQUENCE,
generator ="ebook_sequence"
)
private Long idEbook;
private String title;
}
评论:
@Entity
public class Review {
@Id
@SequenceGenerator(
name="sequence_review",
sequenceName = "sequence_review",
allocationSize = 1
)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence_review"
)
private Long idReview;
private String reviewText;
//ManytoOne Ebook
@ManyToOne(
cascade = CascadeType.ALL,
fetch = FetchType.LAZY
)
@JoinColumn(
name = "id_ebook",
referencedColumnName = "idEbook"
)
private Ebook ebook;
}
我试图插入与现有电子书记录相对应的评论的测试:
@Test
@Transactional
public void saveReviewWithEbook() {
Ebook ebook = ebookRepository.getById((long)1);
Review review = Review.builder()
.reviewText("review text ebook 1")
.ebook(ebook)
.build();
Review reviewInserted = reviewRepository.saveAndFlush(review); //saveAndFlush(review);
Review reviewLoaded = reviewRepository.getById(reviewInserted.getIdReview());
System.out.println("reviewLoaded = " + reviewLoaded);
}
执行后,table'review'中没有插入记录,虽然变量'reviewLoaded'中数据正确显示。这是为什么?如何只保存与现有电子书对应的评论?
为测试打开的事务在测试方法结束时回滚。
这可以被禁用:
@Rollback(false) // <-- !
@Test
public void myTest()
Spring boot test @Transactional not saving
另请注意,ORM(例如 Hibernate)可能会有一些缓存,这可以防止在事务中查询已知实体时实际访问数据库。
因此,要测试实体的成功持久性,最好在单独的事务中测试检索。