gpt4 book ai didi

java - 更新具有延迟加载属性的实体后,JOIN FETCH 无效

转载 作者:行者123 更新时间:2023-12-01 15:07:56 24 4
gpt4 key购买 nike

我们有一个这样的实体:

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

最佳答案

问题似乎是您创建了两个单向关系而不是双向关系。您的一个类需要定义与另一个类的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 documentation ,但他们缺少可以使其更加清晰的示例。

关于java - 更新具有延迟加载属性的实体后,JOIN FETCH 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12729589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com