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