Я использую Hibernate с аннотациями (в spring), и у меня есть объект, у которого есть упорядоченная взаимосвязь "один-к-одному", которая представляет собой дочерний объект, который имеет составной первичный ключ, одним из компонентов которого является внешний ключ возвращается к id родительского объекта.
Структура выглядит примерно так:
+=============+ +================+
| 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;
...
}
Я пришел к этому после долгих приступов экспериментов, в которых большинство моих других попыток дало сущности, которые спящий режим не мог даже загружаться по разным причинам.
ОБНОВЛЕНИЕ: Спасибо всем за комментарии; Я добился определенного прогресса. Я сделал несколько настроек, и я думаю, что это ближе (я обновил код выше). Теперь, однако, проблема заключается в вставке. Родительский объект, кажется, сохраняет штраф, но дочерние объекты не сохраняются, и то, что я смог определить, заключается в том, что спящий режим не заполняет родительскую часть первичного ключа (составного) дочерних объектов, m получить не уникальную ошибку:
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
в своем собственном коде, но, конечно, я не знаю родительский идентификатор, потому что он еще не был сохранен. Любые идеи о том, как убедить спящий режим заполнить это?
Спасибо!