Как правильно использовать сопоставление в Entity для предотвращения ошибки Oracle при сохранении? - PullRequest
0 голосов
/ 19 декабря 2018

Я не гений в подключении Hibernate Entities в Java, так что это может быть очень тривиальный вопрос, но сейчас у меня действительно тяжелые времена, и я не могу понять, как решить эту проблему ...

У меня есть таблица GENERATION и связанный LIMIT_LIST.LIMIT_LIST имеет элемент, который хранится в 3-й таблице (не очень актуально).LIMIT_LIST имеет первичный ключ 3column, и эти три столбца также представлены в таблице GENERATION и связаны между собой, чтобы получить взаимосвязь.

Один элемент Generation может иметь один элемент в таблице Limit_list.

Это соответствующая часть в моем объекте генерации:

@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumns( {
    @JoinColumn(name="LIMIT_LIST_OBJID", referencedColumnName="OBJID", nullable=false, insertable=false, updatable=false),
    @JoinColumn(name="LIMIT_LIST_TY", referencedColumnName="LIMIT_LIST_TY", nullable=false, insertable=false, updatable=false),
    @JoinColumn(name="LIMIT_LIST_KIND_CV", referencedColumnName="LIMIT_LIST_KIND_CV", nullable=false, insertable=false, updatable=false) } )
private LimitList limitList;

Соответствующий внешний ключ в таблице Oracle:

Foreign Key
COLUMN_NAME         COLUMN_POSITION
LIMIT_LIST_OBJID    1
LIMIT_LIST_TY       2
LIMIT_LIST_KIND_CV  3

ссылается на: таблицу LIMIT_LIST

Соответствующая частьв LimitList Entity:

@OneToMany(mappedBy = "limitList", fetch = FetchType.EAGER)
private Set<Generation> generations = new HashSet<Generation>();

Это имеет в качестве первичного ключа три столбца:

Primary Key
COLUMN_NAME         COLIUMN_POSITION
OBJID               1
LIMIT_LIST_TY       2
LIMIT_LIST_KIND_CV  3

Моя проблема: если я сделаю эти вызовы подряд в моем коде:

EntityManager.persist(limitList);
EntityManager.persist(limitListElements);
EntityManager.persist(generation);

Я получаю исключение ORA-00001.Мне кажется, что Hibernate пытается вставить limitList дважды ... Вот почему Oracle выдает ошибку первичного ключа.

Если я удаляю limitList и limitListElements сохраняют часть, потому что я предполагаю, что Hibernate позаботится о...

EntityManager.persist(generation);

это я получил это исключение Oracle:

ORA-02291

Кажется, ничего не работает, и я не знаю, что я сделал не так в сущностиконфиги ... Не могли бы вы мне помочь?Спасибо:)

PS .: эти две постоянные функции работают нормально:

EntityManager.persist(limitList);
EntityManager.persist(limitListElements);

Список и элементы сохраняются без ошибок, проблема возникает, когда я пытаюсь подключитьсписок с моим поколением ...

РЕДАКТИРОВАТЬ:

сущность limitList и их отношения

@OneToMany(mappedBy = "limitList", fetch = FetchType.LAZY)
private Set<LimitListElement> elements = new HashSet<RestrictionListElement>();

@OneToMany(mappedBy = "limitList", fetch = FetchType.EAGER)
private Set<Generation> generations = new HashSetGeneration>();

EDIT2:

Это составной идентификаторlimitList:

@EmbeddedId
@AttributeOverrides( {
    @AttributeOverride(name="objId", column=@Column(name="OBJID", nullable=false, precision=22, scale=0) ),
    @AttributeOverride(name="limitListTy", column=@Column(name="LIMIT_LIST_TY", nullable=false, precision=22, scale=0) ),
    @AttributeOverride(name="limitListKindCv", column=@Column(name="LIMIT_LIST_KIND_CV", nullable=false, precision=22, scale=0) ) } )
private LimitListId id;

1 Ответ

0 голосов
/ 19 декабря 2018

EntityManager.persist(generation); должно быть достаточно для сохранения и LimitList.

Вы должны убедиться, что LimitList.generations заполнен объектом generation, который вы передаете в persist:

Generation generation = // create Generation entity
LimitList limitList = // create LimitList entity

limitList.getGenerations().add(generation);
generation.setLimitList(limiList);

EntityManager.persist(generation);

Не уверен насчет limitListElements, так как нет описания сущности ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...