Я использую Hibernate с аннотациями (весной), и у меня есть объект, который имеет упорядоченную взаимосвязь «один-один», которая представляет собой дочерний объект, который имеет составной первичный ключ, один компонент которого является внешним ключом назад к идентификатору родительского объекта.@OneToMany и составные первичные ключи?
структура выглядит следующим образом:
+=============+ +================+
| ParentObj | | ObjectChild |
+-------------+ 1 0..* +----------------+
| id (pk) |-----------------| parentId |
| ... | | name |
+=============+ | pos |
| ... |
+================+
Я пробовал различные комбинации аннотаций, ни один из которых, кажется, работает. Это ближайший я смог придумать:
@Entity
public class ParentObject {
@Column(nullable=false, updatable=false)
@Id @GeneratedValue(generator="...")
private String id;
@OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
@IndexColumn(name = "pos", base=0)
private List<ObjectChild> attrs;
...
}
@Entity
public class ChildObject {
@Embeddable
public static class Pk implements Serializable {
@Column(nullable=false, updatable=false)
private String parentId;
@Column(nullable=false, updatable=false)
private String name;
@Column(nullable=false, updatable=false)
private int pos;
@Override
public String toString() {
return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString();
}
...
}
@EmbeddedId
private Pk pk;
@ManyToOne
@JoinColumn(name="parentId")
private ParentObject parent;
...
}
Я прибыл на это после длительного боя экспериментов, в которых большинство из моих других попыток давали объекты, которые зимуют не могли даже загружать по разным причинам ,
ОБНОВЛЕНИЕ: Спасибо всем за комментарии; Я добился определенного прогресса. Я сделал несколько настроек, и я думаю, что это ближе (я обновил код выше). Теперь, однако, проблема заключается в вставке. Родительский объект, кажется, сохраняет штраф, но дочерние объекты не сохраняются, и то, что я смог определить, заключается в том, что спящий режим не заполняет родительскую часть первичного ключа (составного) дочерних объектов, м получение не-уникальная ошибки:
org.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already associated
with the session: [org.kpruden.ObjectChild#null.attr1[0]]
Я заполнение name
и pos
атрибутов в моем собственном коде, но, конечно, я не знаю, родительский идентификатор, так как он не сохранен. Любые идеи о том, как убедить спящий режим заполнить это?
Спасибо!
Удачи. Проект, над которым я был, должен был полностью отказаться от составных клавиш в пользу синтетических ключей из-за плохой поддержки Hibernate. –
Исключение может быть вызвано использованием List <>. Вы должны использовать Set <>, чтобы избежать дублирования ключей, используя hashCode и равное определение. Hibernate рассматривает два «логически идентичных» элемента в списке как два элемента, а затем вызывает исключение. – Popeye