2015-04-22 2 views
2

Я использую JPA с Hibernate 4.x. и postgresql 9.x, но мне интересно, какая проблема.JPA с Hibernate 4.x, @ElementCollection, Primary Key

При использовании аннотации @ElementCollection, и я настроил встроенное поле типа Set, я ожидаю генерировать первичный ключ встраиваемой таблицы коллекций, но он не работает. Я могу найти только один внешний ключ против владельца отношений. Интересно, почему он не генерирует первичный ключ. Это мой тестовый код. A.java

@Entity 
public class A { 
    @Id 
    private Long id; 
    @Column(name = "\"as\"") 
    private String as; 
    public String getAs() { 
     return as; 
    } 

    public void setAs(String as) { 
     this.as = as; 
    } 

    @ElementCollection 
    private Set<B> bs = new HashSet<>(); 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Set<B> getBs() { 
     return bs; 
    } 

    public void setBs(Set<B> bs) { 
     this.bs = bs; 
    } 
} 

B.java

@Embeddable 
public class B { 
    private String col1; 
    private String col2; 

    public String getCol1() { 
     return col1; 
    } 

    public void setCol1(String col1) { 
     this.col1 = col1; 
    } 

    public String getCol2() { 
     return col2; 
    } 

    public void setCol2(String col2) { 
     this.col2 = col2; 
    } 
} 

результат

Hibernate: 
    create table A (
     id int8 not null, 
     "as" varchar(255), 
     primary key (id) 
    ) 
Hibernate: 
    create table A_bs (
     A_id int8 not null, 
     col1 varchar(255), 
     col2 varchar(255) 
    ) 
Hibernate: 
    alter table A_bs 
     add constraint FK_rcecll1ao3brmwwnsep3iqq3p 
     foreign key (A_id) 
     references A 

Позвольте мне знать, почему он не генерирует первичный ключ? Заранее спасибо

ответ

1

Потому что @ElementCollection используется для сопоставления наборов простых элементов, которые не совпадают с объектами. Единственное, что им нужно, это ссылка на владеющую сущность, которая должным образом сгенерирована Hibernate (столбец A_id и внешний ключ (A_id) references A). Взгляните на this post для получения дополнительной информации.

Если вам действительно нужен первичный ключ в встраиваемом объекте, подумайте о том, чтобы сделать его подходящей сущностью.

+0

Да, я знаю, что означает у. но я хочу использовать ElementCollection для отображения наборов простых элементов, как это сказал u. Поскольку вы видели, что класс B не является сущностью, просто добавьте встроенную аннотацию. Мне интересно, генерирует ли он составной первичный ключ (A_id, col1, col2) таблицы коллекции A_bs или нет. Я ожидал генерировать первичный ключ, но это не так. Я хочу знать, почему. Я мог бы генерировать первичный ключ при использовании ElementCollection в нескольких книгах JPA. – ohyun

+0

Я использовал java.util.Set type для поля класса, прикрепленного аннотацией '@ ElementCollection'. Затем я ожидаю генерировать ПК, потому что они должны быть уникальными. спасибо – ohyun

+0

В каких книгах JPA вы это видели? Вы читали это? http://en.m.wikibooks.org/wiki/Java_Persistence/ElementCollection#Primary_keys_in_CollectionTable –

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