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 包含在父表中?

【问题讨论】:

告诉我一件事,当您不在父级中添加 SetOneToMany 时,EntityAEntityB 的关系将是什么。映射一个具有多个条目的 EntityAEntityB 你需要在EntityA 中设置EntityA 的其他明智对象,ManyToOneEntityB 是的,在parent中保持OneToMany或在child中保持ManyToOne不会影响DB,它会在child中创建parents ID作为外键。唯一的区别是EntityA可以容纳多个对象(set ) 的孩子。 【参考方案1】:

您的父实体与其子实体具有一对多的关系。

关系是由一个连接列映射的,这个列总是在多方的表中,因此称为拥有方。所以从技术上讲,这种关系是单向的,从孩子到他们的父母。

父实体的表不包含任何关系信息,因此称为non-owninginverse。如果在父端添加正确注释的children 字段,JPA 实现可以“模拟”双向关系,但这不是必需的。

如果您需要从父级遍历到其子级,您可以添加该字段。如果只从children遍历到parent,就不要添加了。

您可以注意到,非拥有方必须使用mappedBy 属性告诉持久性提供者属性名称,拥有方通过该名称引用它,因此关系可以在对象级别上双向工作。

【讨论】:

以上是关于Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?的主要内容,如果未能解决你的问题,请参考以下文章

在实体中包含集合是不是违反了实体的本应?

Hibernate简介

hibernate关联关系查询

即使实体中包含名称获取器,也会烘焙错误的表 displayField

如何使用 JPA+Hibernate 在 json 结果中包含连接列

在实体框架查询中包含多个