我已经看到几个类似的问题和0个好答案.
这应该很简单.我正在使用Java JPA,我想有时加载一个子实体列表但不是所有时间.不幸的是,当我说懒惰地取出它时,JPA似乎没有听我说.我已经100%确定我的代码中没有任何地方以任何方式访问childEntities属性.但是,所有子实体仍然在我的JPA.em().find(..)调用后立即加载.这就是我如何声明与注释的关系.
@Entity
@Table(name = "parentEntities")
public class ParentEntity implements Serializable {
....
@OneToMany(mappedBy = "entityPropertyName", fetch = FetchType.LAZY)
public List<ChildEntity> childEntities;
...
}
Run Code Online (Sandbox Code Playgroud)
这就是我加载父实体的方式:
ParentEntity parentEntity = JPA.em().find(ParentEntity.class, id);
Run Code Online (Sandbox Code Playgroud)
另外,我希望有时候渴望获取这个集合,并能够动态地告诉JPA何时这样做.那是第2步.第1步就是让这个工作正常.
小智 5
我这样做了.请参考这个,它也将出色地工作:
@Entity
@Table(name = "member_information")
public class MemberInformation implements Serilizable{
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE},optional = false)
private MemberInformationDetails memberInformationDetailsId;
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(mappedBy = "memberInformationId", cascade = CascadeType.ALL)
private Collection<AccountOpening> accountOpeningCollection;
}
Run Code Online (Sandbox Code Playgroud)
使用@OneToOne(fetch = FetchType.LAZY....)了一对一的映射,并收集使用@LazyCollection(LazyCollectionOption.TRUE).
@Entity
@Table(name = "member_info_details")
public class MemberInformationDetails implements Serializable{
@OneToOne(mappedBy = "memberInformationDetailsId")
private MemberInformation memberInformationId;
.......//getter and setters
}
@Entity
@Table(name = "account_opening")
public class AccountOpening implements Serializable {
@JoinColumn(name = "member_information_id", referencedColumnName = "id", nullable = false)
@ManyToOne(optional = false)
private MemberInformation memberInformationId;
..........//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
如果要访问集合,请先合并并获取对象:
@Stateless
public class MemberInformationFacade{
..............
public MemberInformation getMemberWithMemberDetails(MemberInformation m) {
m = getEntityManager().merge(m);
try {
m.getMemberInformationDetailsId().getId();
m.getMemberInformationDetailsId().accountOpeningCollection().size();
} catch (Exception e) {
e.printStackTrace();
}
return m;
}
}
Run Code Online (Sandbox Code Playgroud)