В проекте spring mvc с использованием hibernate и jpa у меня есть объект person
и объект role
. Каждый person
может иметь много roles
, но каждый role
может иметь только один person
. Как сохранить новый role
для существующего person
?не сохраняющий дочерний объект
Я прочитал много сообщений об этом. Если я попытаюсь сохранить новый role
, я получаю сообщение о невозможности сохранения отдельного объекта. Но если я попытаюсь сохранить существующий person
, роль не будет сохранена. Я читал this posting, предлагая, чтобы аннотации спящего режима были перемещены в геттеры, но когда я это сделаю, я получаю ошибку сопоставления спящего режима, ссылаясь на неизвестное свойство. И this posting говорит, что разрешение новой ошибки заключается в том, чтобы переместить аннотации обратно в геттеры, не упоминая, что это приводит к ошибке отдельного объекта. Таким образом, различные вопросы переполнения стека указывают на круг. Итак, как я могу исправить свой код, чтобы фактически сохранить новый дочерний объект?
Вот лицо:
@Entity(name = "RimPerson")
@Table(name = "rim_person")
public class RimPerson {
@Id
@Column(name="hppid")
@GenericGenerator(name = "generator", strategy = "native")
@GeneratedValue(generator = "generator")
private Long hppid;
@OneToMany(targetEntity = RimRole.class, cascade = {CascadeType.ALL
}, fetch = FetchType.EAGER)
@JoinColumn(name = "player_rimperson_HJID")
private List<RimRole> playedRoles;
//other properties and getters and setters
}
Роль является:
@Entity(name = "RimRole")
@Table(name = "rim_role")
public class RimRole {
@Id
@Column(name="hppid")
@GenericGenerator(name = "generator", strategy = "native")
@GeneratedValue(generator = "generator")
private Long hppid;
@ManyToOne(targetEntity = RimPerson.class, cascade = {CascadeType.ALL
}, fetch = FetchType.LAZY)
@JoinColumn(name = "player_rimperson_HJID", nullable=true)
private RimPerson player;
//other stuff and getters and setters
}
Вот в JPQL в хранилище слоя:
@Override
public void saveRIMPerson(RimPerson myperson) throws DataAccessException{
if (myperson.getHppid() == null) {this.em.persist(myperson);}
else {this.em.merge(myperson);}
}
Полный код для соответствующих классов можно найти at this link.
Ваш код вызвал новую ошибку, прежде чем я смогу добраться до точки, чтобы проверить ваш код. Я рассмотрю это снова через 12 часов. Здесь поздно. Но новая ошибка, вызванная вашим кодом: 'java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: RimPerson не отображается [SELECT pers FROM RimPerson pers left join fetch pers.names WHERE pers.hppid = : id] ' – CodeMed
Ошибка говорит, что спящий режим не знает, что такое« RimPerson », это невозможно на основе объяснения в вашем вопросе. Пожалуйста, напишите свой файл 'hibernate.cfg.xml', код, который вы попробовали, и завершите stacktrace исключения после того, как у вас есть доступ к вашему компьютеру в дневное время, поэтому я могу проверить его дальше. – Chaitanya
+1 Спасибо. Ошибка отслеживания произошла из-за того, что я переименовал пакет таким образом, чтобы пружина не смогла найти ее, если не изменился файл конфигурации. Ваше предложение помогло мне изолировать эту причину.Он работает сейчас. – CodeMed