jpa Hibernate @ElementCollection

У меня есть вопрос, который меня немного беспокоит.

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

Важное изменение

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

Изменить конец

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)
)

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

С уважением, м

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

PS: @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
)

person mkuff    schedule 10.02.2011    source источник
comment
В вашем примере кода не используется @Enumerated   -  person David Victor    schedule 10.02.2011
comment
Внешний ключ создается отдельным оператором ALTER TABLE, возможно, вы его пропустили.   -  person axtavt    schedule 10.02.2011
comment
Однако я считаю, что вам просто нужна аннотация @Column, которую вы можете установить для нее nullable = false и т. Д., Если хотите.   -  person David Victor    schedule 10.02.2011
comment
@ Дэвид: Именно так. Должен быть ответ.   -  person axtavt    schedule 10.02.2011
comment
Я скопировал определение таблицы после создания. @Column помог, и теперь у меня есть уникальное ограничение. ФК по-прежнему отсутствует. Извините за путаницу в начале. ;-)   -  person mkuff    schedule 10.02.2011
comment
Не беспокойся. Рад помочь. Документация по Hibernate обширна, но вы должны уделять много внимания мелким деталям. Я бы посоветовал попробовать работать со стандартом JPA, где это возможно, и порекомендовать книгу Apress «Pro JPA 2...».   -  person David Victor    schedule 11.02.2011
comment
у меня уже есть книга, и я стараюсь оставаться на jpa2. я просто не мог понять, почему я не получаю pk и внешний ключ обратно к объекту, которому принадлежит коллекция. Спасибо!   -  person mkuff    schedule 11.02.2011


Ответы (1)


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

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

person Jeff    schedule 10.02.2011
comment
Хорошее место. да. Если тип (xxx) не очевиден, вам потребуется (..., targetEntity= xxx). Хотя сущность, эквивалентную String, представить сложно. - person David Victor; 11.02.2011
comment
Под внешним ключом я имел в виду, что из таблицы сбора должен быть внешний ключ обратно к идентификатору сущности и первичный ключ поверх идентификатора сущности и теста. - person mkuff; 11.02.2011
comment
Я обнаружил, что когда я верну свою стратегию наследования на single_table, таблица сбора будет сгенерирована правильно. Возможно проблема с hbm2ddl. теперь работает нормально. большое спасибо всем помощникам! - person mkuff; 11.02.2011