2

我使用 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(),不是吗?

4

0 回答 0