(оригинальный вопрос изменилось, видеть обновления ниже.)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. Я пробовал, но пока не успел.
Вы должны объявить JoinColumn с другой стороны отношения. Объявите отношения '@ ManyToOne' в классе' Child'. Но IMO, у вас есть проблема с дизайном: если у «Parent» есть несколько «Child», как «Parent» может быть основным ключом «Child»? (несколько 'Child' будут иметь тот же« Parent », следовательно, тот же первичный ключ). –
О, вы правы. Это не настоящий первичный ключ !!! Это просто ключ! В таблице нет реального идентификатора. – Nina