我显然很难理解这一点,所以非常感谢...
我有以下映射:
@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;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的数据库中我有:
parent
------
parent_id: 1
child
------
child_id: 1, parent_id: 1
Run Code Online (Sandbox Code Playgroud)
然而
((Parent) session.get(Parent.class, 1)).getChildren()
Run Code Online (Sandbox Code Playgroud)
返回null.
任何人都能看到我失踪的东西吗?
谢谢,p.
编辑
似乎更多的是与会话状态有关,因为集合没有填充在同一会话的上下文中,但是集合在下一个会话中填充...
考虑以下:
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()));
}
Run Code Online (Sandbox Code Playgroud)
得到以下输出:
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
Run Code Online (Sandbox Code Playgroud)
所以,如果它是由于会话状态,并且提交不足以触发重新获取,那么我需要做些什么来获取映射以获取集合?
再次感谢!
是的,提交不会触发会话缓存的刷新。
这里的典型方法是使用每个请求会话模式,以便您在提交后立即关闭会话,并为以下事务打开另一个会话(尽管如果您使用“在视图中打开会话”模式,则这不是一个选项)。
另一个可能有助于解决此问题的好做法是同时修改双向关系的双方:
public class ParentEntity {
...
public void addChild(ChildEntity c) {
children.add(c);
c.setParent(this);
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以使会话缓存中的对象保持一致的状态。
最后,如果您确实需要刷新会话中的对象,您可以调用Session.refresh()它。
| 归档时间: |
|
| 查看次数: |
3011 次 |
| 最近记录: |