为什么Hibernate在发现时不刷新实体?

时间:2019-02-10 12:54:47

标签: java hibernate flush

上下文:

  1. 映射到SQL SELECT的实体类:ItemBidSummary(基于Item和Bid实体)
  2. 涉及Item,Bid和ItemBidSummary类的测试用例;其目的是测试子选择。
  3. 以下代码段是本书的一部分。

ItemBidSummary类:

@org.hibernate.annotations.Subselect(
    value = "select i.ID as ITEMID, i.ITEM_NAME as NAME, " +
            "count(b.ID) as NUMBEROFBIDS " +
            "from ITEM i left outer join BID b on i.ID = b.ITEM_ID " +
            "group by i.ID, i.ITEM_NAME"
)

@org.hibernate.annotations.Synchronize({"Item", "Bid"})
public class ItemBidSummary {
    @Id
    protected Long itemId;
    protected String name;
    // Remaining class....
}

测试用例代码段:

Item item = em.find(Item.class, ITEM_ID); // ITEM_ID is of type long
item.setName("New name");

// No flush before retrieval by identifier!
// ItemBidSummary itemBidSummary = em.find(ItemBidSummary.class, ITEM_ID); // #1

// Automatic flush before queries if synchronized tables are affected!
Query query = em.createQuery( "select ibs from ItemBidSummary ibs where ibs.itemId = :id" ); // #2
ItemBidSummary itemBidSummary = (ItemBidSummary)query.setParameter("id", ITEM_ID).getSingleResult(); // #3

assertEquals(itemBidSummary.getName(), "AUCTION: New name");

图书说明:

  

请注意,Hibernate不会在find()之前自动刷新   操作-必要时仅在执行查询之前。冬眠   检测到修改后的项目将影响查询结果,   因为ITEM表与ItemBidSummary同步。因此,   刷新和ITEM行的更新对于避免查询是必需的   返回过时的数据。

问题:

如果未注释#1,并且注释了#2和#3,则测试用例失败。 Hibernate会在调用#3之前刷新并更新item实例,但不会为#1刷新。为什么?

按照书中的说明-

  

Hibernate检测到修改后的Item会影响结果   查询,因为ITEM表与ItemBidSummary同步。

但是,即使在find()(#1)上使用“ ITEM表也已与ItemBidSummary同步”,为什么Hibernate不刷新它?

0 个答案:

没有答案