hibernate在一个事务中从数据库中获取两个对象

时间:2015-09-28 23:34:45

标签: sql hibernate

我有下一个测试:

public void testAddDonations() throws MalformedURLException, SQLException, DatabaseUnitException {
        prepareCategoriesAndProjects();
        Project proj = (Project) session.get(Project.class, 1);
        Project proj2 = (Project) session.get(Project.class, 2);
        DonationLogic donation = new DonationLogic(10000,50);
        donation.setProject(proj);
        DonationLogic donation2 = new DonationLogic(100000,500);
        donation2.setProject(proj2);

        session.persist(donation);
        session.persist(donation2);
        session.flush();
        Project proj3 = (Project) session.get(Project.class, 2);
        assertEquals(100000, proj3.getDonation());
}

我的问题是,当我首先加载来自数据库的 proj2 getDonation null 时(捐赠中没有内容 em>表尚未完成)。但是,当我尝试从数据库 proj3 (与 proj2 相同)加载时,hibernate不会转到数据库而 getDonation 仍然是。更多 - 测试显示hibernate的proj2和proj3是一个对象。所以hibernate不会第二次进入数据库(我认为因为它认为它已经有了对象 proj2 )。我可以改变这种行为吗?

1 个答案:

答案 0 :(得分:1)

这是Hibernate第一级缓存的工作方式。如果在第一级缓存中找到实体,则不会从数据库中重新读取它们。

为了达到你想要的目的,你可以:

1)Clear刷新后的会话:

session.flush();
session.clear();

这样,第一级缓存将被清空,并在请求时从数据库中重新读取实体。

2)Refresh实体:

session.refresh(proj2);

这种方式proj2使用数据库中的当前状态刷新(影响proj3也因为它是同一个对象)。

3)最后,但最佳和推荐的解决方案,尽可能更新双向关联的双方:

donation2.setProject(proj2);
proj2.setDonationLogic(donation2);
相关问题