2012-03-26 4 views
13

Say, я следующие объекты:Встраиваемый объект с @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 я получить дополнительную таблицу, которая содержит сопоставления между A и C. Но я хотел бы реализовать соотношение «один ко многим», добавив ID в C (без дополнительной таблицы).

Возможно ли это? Если да, какие аннотации следует использовать для создания такого сопоставления?

ответ

7

В общем, это возможно с аннотацией @JoinColumn. Он также работает с вложениями.

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

Если вы не довольны именем A_ID для столбца заданного в встраиваемом, вы можете изменить имя столбца в сущности A:

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

Но как указать, что 'A_ID' является идентификатором сущность 'A'? – jFrenetic

+0

Вам не нужно указывать, что сопоставления, данные в B, оцениваются в контексте A, поэтому ваш провайдер настойчивости знает об этом. Или, может быть, вы имеете в виду, как переопределить имя столбца соединения - я добавил пример для ответа. –

+0

Спасибо большое! Это сработало для меня. Я думал, что мне нужно явно указать поставщику персистентности, какой сущности получить «id», но оказалось, что он немного умнее :) – jFrenetic

Смежные вопросы