上下文:
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不刷新它?