2014-01-15 17 views
1

我有以下父實體Hibernate - 是否需要在父實體中包含Set和OneToMany註釋?

@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; 
} 
} 

我注意到,查詢這些實體的工作,即使我不包括組和父OneToMany註釋表。請參閱下面父無設置:

@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; 
} 

} 

能否請你解釋的差異,如果當它是必要的包括設置在父表?

+1

告訴我一件事情,當你不在母體中添加'Set'和'OneToMany'時,那麼EntityA'和'EntityB'會有什麼關係。要映射一個具有'EntityB'多個條目的'EntityA'你需要在'EntityA'中的'EntityA'中設置'EntityA'的另一個明確對象''ManyToOne'' – Amogh

+0

是的,在父代中保持OneToMany或在子代中保持ManyToOne不會影響數據庫,它會在父代中創建父代ID作爲外鍵。唯一不同的是'EntityA'可以容納多個子對象('set')。 – Amogh

回答

5

您的父母實體與其子女有一對多的關係。

這個關係是由連接列映射的,這個列總是在多方的表中,因此稱爲擁有方。從技術上講,這種關係是一種單向的關係,從孩子到他們的父母。

父實體表不包含任何關係信息,因此它被稱爲非所屬側。如果在父級側添加了正確註釋的children字段,則JPA實現可以「模擬」雙向關係,但這不是必需的。

如果您需要從父級遍歷到它的子級,則可以添加該字段。如果你只是從孩子到父母,不要添加它。

您可以注意到,非擁有方必須使用mappedBy屬性告訴持久性提供者屬性名稱(通過該屬性名稱在擁有方中引用該屬性名稱),因此該關係可以在對象級別雙向工作。

相關問題