2011-02-10 3 views
1

У меня есть вопрос, который меня беспокоит.jpa Hibernate @ElementCollection

Когда я использую @ElementCollection в моей сущности hibernate (3.5), создается таблица без каких-либо ограничений.

Важно Редактировать

My Entity является подклассом другого класса. Возможно, причина этого в том, что спящий режим не генерирует pk и fk.

Edit End

public MyEntity extends BaseEntity 
@ElementCollection(fetch=FetchType.EAGER) 
private Set<String> test; 

Заканчивается с (Postgres 9):

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255) 
) 

Это моя ошибка, что спящий режим не устанавливает каких-либо ограничений, как внешние ключи или уникальные индексы? Я мог бы установить его вручную, но я бы предпочел бы аннотировать сущность правильно, что hibernate полностью (насколько это возможно) создает мою базу данных.

С наилучшими пожеланиями, м

PS: Моя плохо. Смешали две вещи, которые, когда я собираюсь в голове. Я имел ввиду @ElementCollection.

PS: The @Column помогла доставить уникальный индекс. Изменить: исправлены имена в моем примере.

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255), 
    CONSTRAINT itemequipable_test_test_key UNIQUE (test) 
) 

Я бы ожидать что-то вроде этого (псевдо-код):

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL PRIMARY KEY, 
    test character varying(255) PRIMARY KEY, 
    CONSTRAINT fk_entityid references (myentity) on entityid 
) 
+1

В вашем примере кода не используется @ Замечено –

+0

Внешний ключ создается отдельным оператором 'ALTER TABLE', возможно, вы его пропустили. – axtavt

+1

Однако я считаю, что вам просто нужна аннотация @Column, которую вы можете установить для NULL = false и т. Д., Если вы этого пожелаете. –

ответ

1

@column и @ JoinColum/@ OneToMany аннотаций правильный способ обработки внешних ключей и ограничений уникальности, даже с @ElementCollection.

В вашем конкретном примере не будет отношения с внешним ключом, потому что String (тип вашего набора) не сопоставляется с другим объектом.

+0

Хорошее место. Да. Если тип (xxx) не является очевидным, вам потребуется (..., targetEntity = xxx). Хотя сущность, эквивалентная String, трудно себе представить. –

+0

С внешним ключом я подразумевал, что из таблицы сбора должен быть внешний ключ обратно к сущности и первичный ключ по сущности и тесту. – mkuff

+0

Я узнал, что когда я изменю свою стратегию наследования обратно на single_table, таблица коллекции будет сгенерирована правильно. Возможно, проблема связана с hbm2ddl. теперь работает отлично.Большое спасибо всем помощникам! – mkuff

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