【发布时间】:2012-10-04 14:31:20
【问题描述】:
我们有这样的实体:
public User {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", insertable = true, updatable = true)
@ElementDependent
private List<Item_x> item_x_list = new ArrayList<Item_x>();
}
public Item_x {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", insertable = true, updatable = true)
@Element(name = "user_id", required = false)
private Users user;
}
每当我向 User.item_x_list 添加/删除项目,然后使用 em.merge(User.INSTANCE) 持久化 User 实体时,Item_x.user 属性为 NULL。
我正在使用 JOIN FETCH 查询加载 Item_x.user 属性,以确保加载该属性(当我需要它时)。但是:如果您对用户实体执行了合并,即使使用 FETCH JOIN,Item_x.user 属性也是 NULL。
我尝试通过刷新 Item_x.INSTANCE 来解决 但是当我打电话时:
em.refresh(Item_x.Instance);
=> 用户为空。
查看数据库我当然可以看到Item_x中的用户不是空的。
如何强制 OpenJPA 在 Item_x 中正确加载用户? 为什么 OpenJPA 没有正确填充 Item_x.user 属性/忽略 JOIN FETCH 语句?
【问题讨论】:
-
急于加载?仅在需要时才获取用户-我猜这就是懒惰的意义。
-
是的,但问题是在更新实体“Item_x”后,Item_x 的用户属性(我之前使用 JOIN FETCH 查询强制获取)再次为空。那就是问题所在。我在 em.refresh(Item_x.Instance); 中看不到解决方案;因为它将返回相同的实体,但 Item_x.user = NULL。同样重新运行 FETCH JOIN 也不会填满用户。那么如何强制实体加载 Item_x.user ?
-
尝试改写你的问题。您遗漏了太多细节,让别人有机会回答您的问题。
-
@Rick:我刚刚做到了。
标签: java jpa persistence lazy-loading openjpa