2012-03-26 51 views
13

说,我有以下实体:与@OneToMany嵌入实体属性

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Embedded 
    private B b; 

    //getters and setters 
} 

@Embeddable 
public class B { 
    @OneToMany 
    private List<C> cList; 
    //getters and setters 
} 

@Entity 
public class C { 
    @Id 
    @GeneratedValue 
    private Long id; 
    //other fields, getters and setters 
} 

使用模式,自动生成功能,以Hibernate我得到它包含AC之间的映射一个额外的表。但我希望通过将AID加入C,例如没有附加表)来实现一对多关系。

这可能吗?如果是,我应该用什么注释来创建这样的映射?

回答

7

通常可以使用@JoinColumn注释。它也适用于嵌入式。

@OneToMany 
@JoinColumn(name="A_ID") 
private List<C> cList; 

如果你不快乐与嵌入给出A_ID名称栏,您可以在实体中的替换列名:

@AssociationOverride(name= "cList", 
     joinColumns = @JoinColumn(name="SOME_NAME_FOR_JOIN_COLUMN_IN_TABLE_C")) 
@Embedded 
private B b; 
+0

但是我怎么规定,即'A_ID'是标识符实体'A'? – jFrenetic 2012-03-26 19:09:52

+0

您不必指定,B中给出的映射在A的上下文中进行评估,这就是您的持久性提供者知道它的原因。或者,也许你的意思是如何覆盖连接列名 - 我添加了示例来回答。 – 2012-03-26 19:31:38

+0

非常感谢!这对我有效。我以为我需要明确地告诉持久化提供者从哪个实体获得'id',但事实证明它有点聪明:) – jFrenetic 2012-03-26 19:59:56