Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?
Posted
技术标签:
【中文标题】Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?【英文标题】:Hibernate - Is including Set and OneToMany annotation in parent Entity necessary?Hibernate - 是否需要在父实体中包含 Set 和 OneToMany 注释? 【发布时间】:2014-01-15 16:43:57 【问题描述】:我有以下父实体
@Entity
@Table(name = "EntityA", catalog = "mycatalog")
public class EntityA implements java.io.Serializable
private int parentId;
private String a;
private Set<EntityB> entityBs = new HashSet<entityB>(0);
public EntityA()
public EntityA(int parentId)
this.parentId = parentId;
public EntityA(int parentId, String a)
this.parentId = parentId;
this.a = a;
@Id
@Column(name = "PARENT_ID", unique = true, nullable = false)
public int getParentId()
return this.parentId;
public void setParentId(int parentId)
this.parentId = parentId;
@Column(name = "columnA", length = 64)
public String getA()
return this.a;
public void setA(String a)
this.a = a;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "EntityA")
public Set<EntityB> getEntityBs()
return this.entityBs;
public void setEntityBs(Set<EntityB> entityBs)
this.entityBs = entityBs;
和下面的子实体
@Entity
@Table(name = "EntityB", catalog = "mycatalog")
public class EntityB implements java.io.Serializable
private int childId;
private EntityA entityA;
private String b;
public EntityB()
public EntityB(int childId, EntityA entityA)
this.eventId = eventId;
this.entityA = entityA;
public EntityB(int childId, EntityA entityA, String b)
this.childId = childId;
this.entityA = entityA;
this.b = b;
@Id
@Column(name = "CHILD_ID", unique = true, nullable = false)
public int getChildId()
return this.childId;
public void setChildId(int childId)
this.childId = childId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID", nullable = false)
public EntityA getEntityA()
return this.entityA;
public void setEntityA(EntityA entityA)
this.entityA = entityA;
@Column(name = "columnB", length = 64)
public String getB()
return this.b;
public void setB(String b)
this.b = b;
我注意到,即使我没有在父表中包含 Set 和 OneToMany 批注,查询这些实体也能正常工作。请参阅下面没有 Set 的父级:
@Entity
@Table(name = "EntityA", catalog = "mycatalog")
public class EntityA implements java.io.Serializable
private int parentId;
private String a;
public EntityA()
public EntityA(int parentId)
this.parentId = parentId;
public EntityA(int parentId, String a)
this.parentId = parentId;
this.a = a;
@Id
@Column(name = "PARENT_ID", unique = true, nullable = false)
public int getParentId()
return this.parentId;
public void setParentId(int parentId)
this.parentId = parentId;
@Column(name = "columnA", length = 64)
public String getA()
return this.a;
public void setA(String a)
this.a = a;
您能否解释一下区别以及是否以及何时需要将 Set 包含在父表中?
【问题讨论】:
告诉我一件事,当您不在父级中添加Set
和 OneToMany
时,EntityA
和 EntityB
的关系将是什么。映射一个具有多个条目的 EntityA
的EntityB
你需要在EntityA
中设置EntityA
的其他明智对象,ManyToOne
在EntityB
中
是的,在parent中保持OneToMany或在child中保持ManyToOne不会影响DB,它会在child中创建parents ID作为外键。唯一的区别是EntityA
可以容纳多个对象(set
) 的孩子。
【参考方案1】:
您的父实体与其子实体具有一对多的关系。
关系是由一个连接列映射的,这个列总是在多方的表中,因此称为拥有方。所以从技术上讲,这种关系是单向的,从孩子到他们的父母。
父实体的表不包含任何关系信息,因此称为non-owning或inverse。如果在父端添加正确注释的children
字段,JPA 实现可以“模拟”双向关系,但这不是必需的。
如果您需要从父级遍历到其子级,您可以添加该字段。如果只从children遍历到parent,就不要添加了。
您可以注意到,非拥有方必须使用mappedBy
属性告诉持久性提供者属性名称,拥有方通过该名称引用它,因此关系可以在对象级别上双向工作。
【讨论】:
以上是关于Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?的主要内容,如果未能解决你的问题,请参考以下文章
即使实体中包含名称获取器,也会烘焙错误的表 displayField