首页 > 解决方案 > 懒惰的@OneToOne

问题描述

我有 3 个实体:父实体:

@Entity
public class Parent{

@Id
private Long id;

@OneToOne(mappedBy = "parentId", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
private Car car;

@OneToMany(mappedBy = "parentId", cascade = CascadeType.MERGE)
@Fetch(FetchMode.SUBSELECT)
private List<Kid> kids;

和孩子实体:

@Entity
public class Kid{

@Id
private Long id;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="PARENT_ID")
private Parent parentId;

和汽车实体:

@Entity
public class Car{

@Id
private Long id;

@OneToOne(cascade = CascadeType.REMOVE)
@PrimaryKeyJoinColumn(name="PARENT_ID")
private Parent parentId;

数据库是:

Parent: ID
Kid: ID, PARENT_ID
Car: ID, PARENT_ID

每个有车的父母——没有孩子,反之亦然——每个有孩子的父母都没有车。

问题是,如果父母有很多孩子 - 在每次访问孩子时,Hibernate 会调用试图通过其 parentId 获取汽车的冗余查询。(例如 SELECT * FROM CAR WHERE PARENT_ID = ?)

我试图通过将 LAZY 添加到父实体的汽车以及 Car 实体的 PrimaryKeyJoinColumn 来防止这种情况发生 - 但现在当我尝试从汽车访问父实体时,它给了我 null。

如果我希望它在通过 Kid 访问 Parent 时忽略 Car,并且在从 Car 访问 Parent 时没有得到 Parent = null,我该怎么办?

谢谢

标签: javahibernate

解决方案


推荐阅读