gpt4 book ai didi

java - 注释映射双向 OneToMany/ManyToOne 不获取?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:06 25 4
gpt4 key购买 nike

我显然很难理解这一点,因此非常感谢您的帮助...

我有以下映射:

@Entity
@Table(name = "parent")
public class ParentEntity
{
...
@Id
@Column(name = "parent_id")
private Long id;
...
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
private List<ChildEntity> children;
...
}

@Entity
@Table(name = "child")
public class ChildEntity
{
...
@Id
@Column(name = "child_id")
private Long id;
...
@ManyToOne(fetch = FetchType.EAGER)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "parent_id")
private ParentEntity parent;
...
}

在我的数据库中我有:

parent
------
parent_id: 1

child
------
child_id: 1, parent_id: 1

不过

((Parent) session.get(Parent.class, 1)).getChildren()

返回空值。

谁能看到我遗漏了什么?

谢谢,p。

编辑

它似乎更适合 session 状态,因为集合不会在同一 session 的上下文中填充,但集合会在下一个 session 中填充...

考虑以下几点:

void setupRender()
{
debug("existing not just added", (ParentEntity) session.get(ParentEntity.class, 13L));

ParentEntity parent = new ParentEntity();
session.save(parent);

ChildEntity child = new ChildEntity();
child.setParent(parent);
session.save(child);

debug("new one before commit", parent);

sessionManager.commit();

debug("new one after commit", parent);

debug("new one after re-fetch", (ParentEntity) session.load(ParentEntity.class, parent.getId()));
}

private void debug(String prefix, ParentEntity parent)
{
log.debug(prefix + ": parent id: " + parent.getId() + ", Children is "
+ (parent.getChildren() == null ? "null" : "size:" + parent.getChildren().size()));
}

结果如下:

DEBUG - existing not just added: parent id: 13, Children is size:1
DEBUG - new one before commit: parent id: 23, Children is null
DEBUG - new one after commit: parent id: 23, Children is null
DEBUG - new one after re-fetch: parent id: 23, Children is null

因此,如果是由于 session 状态,并且提交不足以触发重新获取,我需要做什么才能获取映射以获取集合?

再次感谢!

最佳答案

是的,提交不会触发 session 缓存的刷新。

此处的典型方法是使用每个请求的 session 模式,以便您在提交后立即关闭 session ,并为以下事务打开另一个 session (尽管如果您使用 Open Session in View pattern 则不是一个选项)。

另一个可能有助于解决这个问题的好做法是同时修改双向关系的两边:

public class ParentEntity {
...
public void addChild(ChildEntity c) {
children.add(c);
c.setParent(this);
}
}

通过这种方式,您可以使 session 缓存中的对象保持一致状态。

最后,如果您确实需要刷新 session 中的对象,您可以对其调用 Session.refresh()

关于java - 注释映射双向 OneToMany/ManyToOne 不获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5958627/

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