我使用 JUnit + Spring + JPA
我有两个具有@OneToOne 关系的实体:
@Entity
public class Principal {
//...
@OneToOne
@JoinColumn(name = "user_id")
private User user;
//...
}
@Entity
public class User extends AbstractEntity {
//...
@OneToOne(mappedBy = "user")
private Principal principal;
//...
}
而且我误解了在我的 JUnit 测试中的事务中使用它们:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JPATestConfig.class})
@TransactionConfiguration(defaultRollback = false)
public class JpaTest {
@PersistenceContext
protected EntityManager em;
private Long userId;
String jstl = "SELECT DISTINCT a FROM User a WHERE a.id = :id";
@Test
@Transactional
public void test() {
User user = new User();
em.persist(user);
Principal principal = new Principal();
principal.setUser(user);
em.persist(principal);
TypedQuery<User> query = em.createQuery(jstl, User.class);
query.setParameter("id", user.getId());
User user1 = query.getSingleResult();
//... In this point I have
//... user1.principal == null
}
@After
@Transactional
public void anotherTest(){
TypedQuery<User> query = em.createQuery(jstl, User.class);
query.setParameter("id", userId);
User user1 = query.getSingleResult();
//... different transaction, but still user1.principal == null
}
}
为什么我不能在同一个 jUnit @Transactional 测试中(即使在同一个 jUnit 测试类中)使用刚刚创建和持久化的实体的 @OneToOne 参数?
但是测试后的数据库已经填好了,所以我可以开始另一个测试,其中已经存在实体的绑定是成功的。
编辑
好的,
em.persist(principal);
em.flush();
em.clear();
有足够的帮助,但我仍然无法理解为什么绑定不起作用anotherTest()
?
当 transaction() 结束时,EntityManager 会自行刷新test()
,不是吗?