Java 注释映射双向一个域/多个域不获取?
很明显,我很难理解这一点,所以非常感谢您的帮助 我有以下映射:Java 注释映射双向一个域/多个域不获取?,java,hibernate,Java,Hibernate,很明显,我很难理解这一点,所以非常感谢您的帮助 我有以下映射: @Entity @Table(name = "parent") public class ParentEntity { ... @Id @Column(name = "parent_id") private Long id; ... @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER) private List<ChildEnt
@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) session.get(Parent.class, 1)).getChildren()
返回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()));
}
结果如下:
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
因此,如果这是由于会话状态造成的,并且commit不足以触发重新获取,那么我需要做什么才能获取映射以获取集合
再次感谢 在您最初的问题中,这意味着在您打开会话之前数据库中已经存在数据,这是您在同一会话中保存数据的关键信息 下面是关于该主题的官方Hibernate指南: (摘自) 我在双向关联方面遇到问题。 更新双向关联时,必须更新两端
parent.getChildren().add(child);
child.setParent(parent);
最好在持久类的关联管理方法中实现这一点
我还是有麻烦强>
阅读文档!参考文档的第16章中有一个关于“父/子关系”的详细章节,包括代码示例。在父实体中添加级联属性作为OneToMany的一部分可能会解决此问题
@Entity
@Table(name = "parent")
public class ParentEntity
{
...
@Id
@Column(name = "parent_id")
private Long id;
...
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private List<ChildEntity> children;
...
}
这也将在删除父级时删除所有子级。是,提交不会触发会话缓存刷新 这里的典型方法是使用session per request模式,以便在提交后立即关闭会话,并为以下事务打开另一个会话(尽管如果使用该模式,这不是一个选项) 另一个可能有助于解决此问题的良好实践是同时修改双向关系的双方:
public class ParentEntity {
...
public void addChild(ChildEntity c) {
children.add(c);
c.setParent(this);
}
}
通过这种方式,您可以使会话缓存中的对象保持一致状态
最后,如果您确实需要刷新会话中的对象,则可以对其调用session.refresh()
。是在构造过程中手动初始化集合:
private List<ChildEntity> children
= new ArrayList<ChildEntity>;
私有列表子项
=新阵列列表;
我不确定这是否是一个好的做法,但它有效且简单。这是一个列表这一事实与此无关。此外,如果
getChildren()
返回null,则成功加载了父级
,因此从数据库读取似乎正常。查看Hibernate调试数据时,您是否获得任何有用的信息?请参阅编辑。顺便说一句,db是postgres,我也在使用tapestry hibernate模块的tapestry环境中。正确,但不是这里的问题:)
public class ParentEntity {
...
public void addChild(ChildEntity c) {
children.add(c);
c.setParent(this);
}
}
private List<ChildEntity> children
= new ArrayList<ChildEntity>;