【发布时间】:2018-02-12 12:21:39
【问题描述】:
实现一对多关系并选择父子关系
我有一个onetomany 关系,我想做一个查询(选择 *)
文件夹.java
@Entity
@Table(name = "FOLDERS")
public class Folders implements Serializable {
@Id
@Column(name = "id")
Long id;
@ManyToOne
@JoinColumn(name = "Folder_Author", insertable=false, updatable=false)
private Authors author;
// Getter + setter
}
Authors.java
@Entity
@Table(name = "AUTHORS")
public class Authors implements Serializable {
@Id
@Column(name = "id")
Long id;
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
@JoinColumn(name = "Folder_Author", referencedColumnName = "id", nullable=false)
private List<Folders> folders = new ArrayList<Folders>();
}
我的要求:
Query query = em.createQuery("SELECT f FROM Folders f");
return query.getResultList();
我得到了这个结果:
[
{
"id":29,
"noFolder":"0017",
"author":{
"id":9,
"name":"Alpha",
"service":null,
"folders":[
{"id":29,
"noFolder":"0017",
"author":{
"id":9,
"name":"Alpha",
"service":null,
"folders":[
{
"id":29,
"noFolder":"0017",
"author":{
"id":9,
"name":"Alpha",
"service":null,
"folders":[
..
..
}
]
我的代码有什么问题?执行查询时出现什么问题我得到了这个结果.. .. 我想得到这个结果
[
{
"id":29,
"noFolder":"0017",
"author":{
"id":9,
"name":"Alpha",
"service":null,
}
}
]
【问题讨论】:
-
您的意思是您希望 1-N 字段延迟加载,并将其设置为 EAGER?
-
是的,你说得对,但是当我尝试惰性时,我得到了这个错误:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: business.entities.folders.Authors.folders, could not initialize proxy - no Session at rg.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) at.. -
OneToMany也需要一个 mappedBy 指定链接双方。 -
我更新了,现在是这样的:
@OneToMany(mappedBy="author", targetEntity=Folders.class, fetch=FetchType.LAZY, cascade=CascadeType.PERSIST) @Fetch(FetchMode.SELECT) private List<Folders> folders = new ArrayList<Folders>(); -
wtf 是字段“发起者”吗?应该是您发布的代码中的“作者”
标签: hibernate jpa hibernate-mapping hibernate-onetomany