【问题标题】:Issue with fetching data in a One to Many relationship in JPA在 JPA 中以一对多关系获取数据的问题
【发布时间】:2013-01-30 16:58:14
【问题描述】:

我试图让问题变小,但我无法让它变小:(

我有 2 个实体,它们是这样关联的:

Collection (1) ----> (n) Item
Item (0 or 1) -----> (n) Item

即每个Item 都与Collection 相关。此外,每个Item 可以有0 个或多个子Item。如果有子Item,则子Item 将有一个非空的parent_item_id

表格:

收藏

collection_id raw

物品

item_id raw
collection_id raw
parent_item_id raw

映射:

class Collections
{
   @Id @Column("collection_id")
   String id;

   @OneToMany(fetch=FetchType.EAGER, cascadeType.ALL, mappedBy="collection")
   List<Items> items;
}

class Items
{
  @Id @Column("item_id")
  String id;

  @ManyToOne(optional=false)
  @JoinColumn(name="collection_id")
  Collections collection;

  @ManyToOne(optional=true)
  @JoinColumn(name="parent_item_id")
  Items parentItem;
}

假设我创建了一个这样的对象:

//Constructor parameters are the Ids.
Collections collection1 = new Collections("1234");
Items i1 = new Items("111");
Items i2 = new Items("222");
item1.parentItem = item2;
item1.collection = collection1;
item2.collection = collection1;
List<Items> listItems = new ArrayList<Items>(1);
listItems.add(item2);
collection1.items = listItems;

我们有一个数据访问层 (DA),它是 JPA 和 Hibernate 的包装器。 接下来,我执行两个操作:

Collections collection1 = DA.merge(collection1);
Collections collection2 = DA.find(collection1.id);

我希望collection2.items.size() 返回 2。但它返回 1。(PS:实际上有 2 个项目与 collection1 相关)。

可以解释一下吗?这是预期的还是 DA 中的错误? JPA 是否缓存 Collection?

稍后,如果在不同的事务中,我尝试获取 Collections collectionNew = DA.find("1234").items.size() 它返回 2(预期);

【问题讨论】:

    标签: hibernate jpa one-to-many dao many-to-one


    【解决方案1】:

    合并前后collection1中的items.size()是什么? JPA 实体是常规对象,因此如果大小不是 2,除非您从数据库中刷新实体,否则它不会在查找之后。

    【讨论】:

    • 是的,它是 1。好的,我明白了。以及如何强制它从数据库中获取?
    • 保持双向关系是更好的方法,或者您可以在comit或flush之后使用em.refresh来获取更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多