我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西
我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们
@Entity
public class Department {
@Id
private Integer id;
//...
}
1/
@Entity
public class Employee {
@Id
private Integer id;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "id_department", referencedColumnName = "id")
private Department department;
//...
}
SELECT e FROM Employee e LEFT JOIN FETCH e.department WHERE e.id=:id
2/
@Entity
public class Employee {
@Id
private Integer id;
@ManyToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(name = "id_department", referencedColumnName = "id")
private Department department;
//...
}
JPQL查询:
SELECT e FROM Employee e WHERE e.id=:id
=>两次选择=>速度较慢,但department作为department加载,并且在应用程序的视图部分中一切正常
问题是,当您使用惰性加载时,您将获得类的代理(如您所述),并且只有当hibernatesession仍然打开时,该代理才能从数据库中获取数据。当将数据返回到视图时,会话似乎被关闭了,所以当试图使用视图中懒散加载的字段时,您会得到异常。
可能的解决办法:
get
方法,以便代理检索会话关闭后要使用的相关数据。我的理解是,默认情况下,Hibernate将所有关系类型的FetchType设置为lazy。 在我的例子中,我有一个双向的OneToMany-ManyToOne关系,如下所示: 另一个问题是我如何得到一个有特定名字的孩子?是否可以通过存储库进行操作?还是需要getChildren(parentId)并迭代直到找到以特定方式命名的那个? 编辑:在一些建议之后,我继续这样实现了我的ChildRepos
我有两个大表(每个表>一亿行),让我们把它们称为Parent和Child(Parent与Child有一个懒散的一对多关系)。当我使用联接提取时,查询速度非常慢,而且我还得到一个Hibernate警告“HH000104 firstresult maxresults specified with collection fetch Application in Memory”,因为我使用了一个限制。 因
我有一个简单的控制器返回一个用户对象,这个用户有一个属性坐标,它具有hibernate属性FetchType.lazy。 当我尝试获取这个用户时,我总是必须加载所有坐标来获取用户对象,否则当Jackson尝试序列化用户时抛出异常: 和控制器: 有办法告诉Jackson不要连载未蚀刻的对象?我一直在寻找3年前发布的实现Jackson-Hibernate-Module的其他答案。但也许可以通过杰克逊的
我有两个实体。我想在持久化所有者实体时级联插入子实体,并将子实体的SSO_ID设置为生成器为所有者生成的实体。 ID类是: 相反,我得到了一个错误: 插入hub_users_emails(user_sso_idemail_typesso_idstart_dateuser_mail)值 (?, ?, ?, ?, ?) (等) 绑定参数[1]as[BIGINT]-[1234837655]= (等) 将
null 但是在Eclipse中测试它之后,它渴望得到所有的东西。 是否取决于我使用的是JPA还是Hibernate?
考虑以下实体: 的应该被延迟获取。问题是,当使用