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