0

我们有这样的实体:

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 语句?

4

1 回答 1

1

看起来问题在于您创建了两个单向关系而不是双向关系。您的一个类需要定义与另一个类的 mappedBy 关系,该关系将另一个类定义为关系的“所有者”。例如,您可以更改上面的示例以将 Item_x 定义为所有者,如下所示:

public User {
    @OneToMany(targetEntity = Item_x.class, mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @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;
}

OpenJPA 文档中提供了更多信息,但它们缺少可以使其更清晰的示例。

于 2012-10-05T03:38:57.027 回答