我在使用hibernate的session.load函数时遇到了问题。我尝试根据ID获取对象,并返回一个好的对象,但只在实例中设置了原始属性。我有一个属性是一个集合(映射到一些其他对象),但它没有在集合后检索,并且集合的字段为空。
有没有人知道为什么提取不能按预期工作?
由于
答案 0 :(得分:0)
检查ORM上的提取策略。一些属性可以设置为惰性而不是急切。您可能必须在加载后使用Hibernate.Initialize来填充所有属性。否则,您将不得不修改您的ORM以使用预先加载。使用注释,您可以在@entity属性之后设置以下属性以默认关闭延迟:
@ org.hibernate.annotations.Proxy(lazy = false)
但是,这会导致在获取时加载所有内容。
答案 1 :(得分:0)
我认为Set是延迟加载的,如果你想要它被填充,你可以简单地调用该Set的getter并且它将被加载。 如果您希望它一直加载
fetch = FetchType.EAGER
示例:
@OneToMany(mappedBy = "program", fetch=FetchType.EAGER)
private final List<Instruction> instructions = new ArrayList<Instruction>();
到你的实体的映射
答案 2 :(得分:0)
除非你100%肯定,否则你总是希望加载孩子,设置EAGER
抓取可能会导致不良后果。 JBoss工具集默认设置为LAZY
。
相反,您需要初始化子关联,这可以通过多种方式完成:
Hibernate.initialize(myObject.getChildren())
size
myObject.getChildren().size()
Criteria
查询中,将关联中的FetchMode
设置为JOIN
:criteria.setFetchMode("children", FetchMode.JOIN);