org.hibernate.PropertyValueException - PullRequest
0 голосов
/ 14 июля 2011

У меня есть эти Pojos:

public class ParticipantPojo implements Serializable
.....
@OneToMany(mappedBy = "participant", cascade = CascadeType.ALL)
private Set<ParticipantIdentificationNumberPojo> identificationNumbers;

и

public class ParticipantIdentificationNumberPojo implements Serializable
 ......
@ManyToOne
@JoinColumn(name = "PARTICIPANT", nullable = false)
private ParticipantPojo participant;

Когда я хочу создать нового участника с

 ParticipantPojo pojo= new ParticipantPojo ();
 ...
 Set<ParticipantIdentificationNumberPojo> identSet = new HashSet<ParticipantIdentificationNumberPojo>();
 ParticipantIdentificationNumberPojo identInfo= new ParticipantIdentificationNumberPojo();
 identInfo.setType("xyz");
 identInfo.setNumber(12345);
 identSet.add(identInfo);
 pojo.setIdentificationNumbers(identSet);

и сохранить его

 session.save(pojo);

я получаю следующую ошибку:

org.hibernate.PropertyValueException: not-null property references a null or transient value: de.seeburger.marktpartnerdaten.database.pojo.ParticipantIdentificationNumberPojo.participant

В блоге я нашел решение установить nullable = true в

@JoinColumn(name = "PARTICIPANT", nullable = false)

, но это не то, что яхочу (участник не должен быть нулевым!) ... установка nullable = true создать еще одно исключение

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: de.seeburger.marktpartnerdaten.database.pojo.ParticipantPojo

Я думаю, что проблема в том, что Hibernate не сохраняет участника и использует идентификатор для сохранения memberIdentificationNumber ...но я не нашел решения для моего исключения: - (

1 Ответ

1 голос
/ 14 июля 2011

Вы создали двунаправленную связь с ParticipantPojo, выступающей в качестве определяющей стороны (со свойством mappedBy в аннотации @OneToMany). ParticipantIdentificationNumberPojo является стороной-владельцем отношений, и вы должны зарегистрировать экземпляр определяющей стороны на стороне-владельце.

Итак, вам нужно зарегистрировать экземпляр ParticipantPojo следующим образом:

ParticipantPojo pojo= new ParticipantPojo ();
...
Set<ParticipantIdentificationNumberPojo> identSet = new HashSet<ParticipantIdentificationNumberPojo>();
ParticipantIdentificationNumberPojo identInfo= new ParticipantIdentificationNumberPojo();
identInfo.setType("xyz");
identInfo.setNumber(12345);
identInfo.setParticipantPojo(pojo); // <-- Registering the instance on the owning side.
identSet.add(identInfo);
pojo.setIdentificationNumbers(identSet);

В идеале вы должны регистрировать отношения в обоих направлениях, даже если вы объявили двунаправленные отношения. Hibernate, однако, упростит задачу, если вы установите значение на стороне-владельце, поскольку эта сторона содержит внешний ключ; подумав об этом, вы поймете причину появления второго сообщения об ошибке - внешние ключи не могут быть нулевыми.

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