【发布时间】:2020-11-10 16:10:39
【问题描述】:
我正在使用 JpaRepositories 处理 JPA/Hibernate 实体。我很少有具有@OneToOne 和@OneToMany 关系的实体。为了使代码简洁明了,我将实体命名为 A、B、C、D 等。A 是根实体,在链下是带有连接策略的继承。请看下面的代码-
A.java
@Entity
@Table(name = "A")
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long aId;
@Column
private String name;
@OneToOne
@JoinColumn(name = "bId")
private B b;
@OneToMany(mappedBy = "a")
private Set<C> cSet;
// other entity specific fields
// getters and setters
}
B.java
@Entity
@Table(name = "B")
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long bId;
// other entity specific fields
// getters and setters
}
C.java
@Entity
@Table(name = "C")
public class C {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long cId;
@ManyToOne
@JoinColumn(name = "aId", referencedColumnName = "aId")
private A a;
@OneToMany(mappedBy = "c")
private Set<D> dSet;
// other entity specific fields
// getters and setters
}
D.java
@Entity
@Table(name = "D")
@Inheritance(strategy = InheritanceType.JOINED)
public class D {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long dId;
@ManyToOne
@JoinColumn(name = "cId", referencedColumnName = "cId")
private C c;
@OneToMany(mappedBy = "d")
private Set<E> eSet;
// other entity specific fields
// getters and setters
}
E.java
@Entity
@Table(name = "E")
public class E {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long eId;
@ManyToOne
@JoinColumn(name = "dId", referencedColumnName = "dId")
private D d;
// other entity specific fields
// getters and setters
}
F.java
@Entity
@Table(name = "F")
public class F extends D {
@OneToMany(mappedBy = "d")
private Set<H> hSet;
// other entity specific fields
// getters and setters
}
G.java
@Entity
@Table(name = "G")
public class G extends D {
@OneToMany(mappedBy = "d")
private Set<I> iSet;
// other entity specific fields
// getters and setters
}
H.java
@Entity
@Table(name = "H")
public class H {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long hId;
@ManyToOne
@JoinColumn(name = "dId", referencedColumnName = "dId")
private D d;
// other entity specific fields
// getters and setters
}
I.java
@Entity
@Table(name = "I")
public class I {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long iId;
@ManyToOne
@JoinColumn(name = "dId", referencedColumnName = "dId")
private D d;
// other entity specific fields
// getters and setters
}
如果您看到继承从作为父实体 D 开始,G 和 F 扩展 D。我需要通过 EnityGraph 或 Join fetch 获取所有实体。所有的协会都是懒惰的。我有根 A 的 id。当我调用 ...aRepository.findById(aId);
我尝试了许多解决方案,但无法获取。创建 EntityGraph 的问题是实体链之间的继承。我能够获取的唯一方法是当我建立关联时 EAGER。我不想将@OneToMany 映射为 EAGER。
谁能建议我一个解决方案(@EntityGraph 或加入 Fetch)来执行此任务?
【问题讨论】:
标签: java spring-boot hibernate jpa spring-data-jpa