Hibernate Eager和Lazy在实体中加载多个ManyToOne关系

时间:2017-04-06 15:53:33

标签: hibernate jpa

我拥有3个ManyToOne关系的Mandate类

@Entity
@Table(name="MANDATE")
public class Mandate {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID", nullable=false)
private Long Id;

@ManyToOne
@JoinColumn(name="ID_PERSONNE", nullable=false)
private Person person;

@Column(name="TITRE", nullable=false)
private String titre;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="ID_LIGUE", nullable=false)
private League league;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="ID_FEDERATION", nullable=false)
private Federation federation;

我找到了OneToMany关系的人员课程

@OneToMany(mappedBy="person", fetch=FetchType.LAZY)
private Set<Mandat> mandates;

这意味着在我的数据库中,一个人可以在联盟或联盟中拥有任务。 如果他在一个联盟中有一个任务,联邦领域将为空,反之亦然。

但在我的控制器中,当我这样做时:

person.getMandates().size();

我总是得到0个元素的大小。

生成的hibernate查询看起来像这样(我简化了它):

SELECT  MANDATE.*, LEAGUE.*, FEDERATION.* 
from MANDATE 
inner join LEAGUE on  MANDATE.ID_LEAGUE = LEAGUE.ID
inner join FEDERATION on MANDATE.ID_FEDERATION = FEDERATION.ID WHERE MANDATE.ID_PERSON = 1; 

这意味着生成的请求正在查找具有非空联盟联合字段的mandat字段,但在我的数据库中永远不会为真。

我注意到,如果我对我的字段进行延迟加载,我会得到尝试的结果:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_LIGUE", nullable=false)
private League league;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_FEDERATION", nullable=false)
private Federation federation;

我做错了什么?

1 个答案:

答案 0 :(得分:0)

该人可以获得联盟或联盟的授权,这意味着他们中的任何一个在任何时候都将为空。因此,可以在joincolumns上实现可以为空的值。因此,您无法获取任务数据。

当您使用延迟加载时,将在不加入联合表的情况下触发特定于单独的任务的单独查询,该联合表将在人对象上调用getMandates()时返回结果。