我拥有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;
我做错了什么?
答案 0 :(得分:0)
该人可以获得联盟或联盟的授权,这意味着他们中的任何一个在任何时候都将为空。因此,可以在joincolumns上实现可以为空的值。因此,您无法获取任务数据。
当您使用延迟加载时,将在不加入联合表的情况下触发特定于单独的任务的单独查询,该联合表将在人对象上调用getMandates()时返回结果。