2014-11-11 2 views
0

В проекте 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.

ответ

1

У вас есть двунаправленное отношение «один ко многим» между объектами RimPerson и RimRole. Таким образом, вы должны сказать спящий режим, который является владельцем объединения с помощью атрибута mappedBy, в случае one-to-many отношений, которые many сторона рассматривается как владелец ассоциации, поэтому в RimPerson отображение должно быть так:

@OneToMany(targetEntity = RimRole.class, mappedBy="player", cascade = {CascadeType.ALL 
    }, fetch = FetchType.EAGER) 
    private List<RimRole> playedRoles; 

Примечание что мы должны удалить аннотацию @JoinColumn. Также значение атрибута mappedBy должно совпадать с именем свойства, которое вы определили в RimRole, которое равно player.

Теперь для двунаправленной ассоциации вам нужно установить свойства с обеих сторон лиц, это означает:

rimPerson.setPlayedRoles(playedRoles); 
rimRole.setPlayer(player); 

Попробуйте обновить свой код с этими изменениями и запустить приложение, это должно исправить вопрос.

+0

Ваш код вызвал новую ошибку, прежде чем я смогу добраться до точки, чтобы проверить ваш код. Я рассмотрю это снова через 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

+0

Ошибка говорит, что спящий режим не знает, что такое« RimPerson », это невозможно на основе объяснения в вашем вопросе. Пожалуйста, напишите свой файл 'hibernate.cfg.xml', код, который вы попробовали, и завершите stacktrace исключения после того, как у вас есть доступ к вашему компьютеру в дневное время, поэтому я могу проверить его дальше. – Chaitanya

+0

+1 Спасибо. Ошибка отслеживания произошла из-за того, что я переименовал пакет таким образом, чтобы пружина не смогла найти ее, если не изменился файл конфигурации. Ваше предложение помогло мне изолировать эту причину.Он работает сейчас. – CodeMed

Смежные вопросы