1

(оригинальный вопрос изменилось, видеть обновления ниже.)Hibernate - с помощью составного ключа, который содержит идентификатор родительского - OneToMany

У меня есть проблемы позволяя зимуют установить первичный ключ дочернего объекта. Первичный ключ идентичен первичному ключу родителя.

Это то, что родитель выглядит следующим образом:

@Entity 
@Table(name = "PARENT") 
@SequenceGenerator(name = "SEQ", allocationSize = 1, sequenceName = "seq_parent_id") 
public class Parent { 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ") 
    private Long id; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SUBSELECT) 
    @JoinColumn(name = "PARENT_ID") 
    private Set<Child> children; 

Это то, что ребенок выглядит следующим образом:

@Entity 
@Table(name = "CHILDREN") 
public class Child { 

    @Id 
    @Column(name = "PARENT_ID") 
    private Long parentId; 

Теперь, когда я запускаю тест хранилища JUnit, где я пытаюсь спасти я получаю исключение:

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ... 

Каков правильный способ дать h ibernate автоматически устанавливает Child.parentId в parent.id?

Я попытался дать ребенку родителя. Но столкнулся с другими исключениями, поскольку Родитель не является Идентификатором.

UPDATE

я понял, что идентификационный номер ребенка не является реальным первичным ключом. Это всего лишь ключ отображения. Для parent.id может быть несколько дочерних записей.

Update

Теперь я начинаю понимая, что мне действительно нужно:

первичного ключ ребенка является составным ключом из трех значений: родительский идентификатор и еще двух строковых значений.

@Entity 
@Table(name = "CHILDREN") 
public class Child { 

    @Column(name = "PARENT_ID") 
    private Long parentId; 

    @Column(name = "PROPERTY_NAME") 
    private String propertyName; 

    @Column(name = "ANOTHER_PROPERTY") 
    private String anotherProperty; 

    @Column(name = "PROPERTY_VALUE") 
    private String propertyValue; 

Так что мне нужно отобразить составной ключ, используя parentId, properyName и anotherProperty. propertyValue - это фактическое значение этой записи.

Возможно, мне понадобится использовать IdClass или embeddedId. Я пробовал, но пока не успел.

+1

Вы должны объявить JoinColumn с другой стороны отношения. Объявите отношения '@ ManyToOne' в классе' Child'. Но IMO, у вас есть проблема с дизайном: если у «Parent» есть несколько «Child», как «Parent» может быть основным ключом «Child»? (несколько 'Child' будут иметь тот же« Parent », следовательно, тот же первичный ключ). –

+0

О, вы правы. Это не настоящий первичный ключ !!! Это просто ключ! В таблице нет реального идентификатора. – Nina

ответ

1

Это может зависеть от вашей предполагаемой семантики, но если дочерний PK также является FK для родителя, тогда я бы предположил, что представляет собой отношение типа IS-A или, в терминах базы данных, что CHILD является таблицей расширений для РОДИТЕЛЯ. Вы можете посмотреть, как настроить его как наследование на класс.

UPDATE

Так на основе вашего обновления, ParentID в ребенке не PK ребенка; что означает, что он не должен быть аннотирован @Id и должен быть установлен как любой другой FK. Я бы не рассматривал ParentID, а скорее отображал Parent, хотя YMMV.

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

+0

Не уверен, что я правильно понял вас, но я не стал бы рассматривать это как расширение родительского стола, так как у родителя может быть много детей. – Nina

+0

Если у родителя может быть много детей, то ПК на дочерней таблице не может быть FK родительской PK. –

+0

Ничего, я вижу ваше обновление на вопрос ... –

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

  • Нет связанных вопросов^_^