Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Внешний ключ JPA 2.1 не сохраняет каскад ManyToOne

Автор вопроса: RisuОтветов: 1

У меня два класса.

public class Reservation {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy = "reservation")
    private List<Night> nights;  \\assume getters and setters
}

public class Night {
    @ManyToOne
    @JoinColumn(name = "RESERVATION_ID")
    private Reservation reservation;
}

Мои сохранения работают так:

Reservation r = new Reservation();
r.getNights().add(new Night());
return dao.save(r);

Это работает, так как спасает Резервацию и спасает Ночь. Но когда я смотрю на базу данных, столбец RESERVATION_ID в таблице NIGHT имеет значение null.

В предыдущих проектах (до обновления до Java 8 и JPA 2.1) мне не нужно было вручную устанавливать родительский объект для дочернего объекта, чтобы эта ассоциация сохранялась. Что-то изменилось, или я что-то не так делаю?

Редактировать:

Это правильно сохраняет ассоциацию, но раньше в этом не было необходимости.

Reservation r = new Reservation();
Night n = new Night();
n.setReservation(r);
r.getNights().add(n);
return dao.save(r);
  • Спасибо за вашу ссылку, однако я не вижу, как она помогает ответить на мой вопрос. Это двунаправленная связь, как показано в коде. Risu 23.07.2014
  • это было вернуться к вашему вопросу Did something change, or am I doing something wrong? Таким образом, ответ, вы не пропали без вести. Вот так это должно быть реализовано. Однако вы можете сделать его однонаправленным и добавлять/удалять их по отдельности. Это ваш выбор (на мой взгляд). pms 23.07.2014
  • Простите мою путаницу, но вы говорите, что r.getNights().add(new Night()); (до редактирования) должно работать, чтобы сохранить ассоциацию? Risu 23.07.2014
  • Извини, я виноват. Да, вам нужно установить родительский объект в дочернем. Вы можете сделать это в родительском классе (дочерний метод получения). pms 23.07.2014
  • Итак, после редактирования это то, что должно быть, а до редактирования было просто какое-то автоматическое волшебство, на которое я не должен был полагаться. Правильный? Risu 23.07.2014
  • Извините, я не понял вашего вопроса. pms 23.07.2014

javahibernatejava-8jpa

Ответы

Ответ 1 · рейтинг 1 · pms

В соответствии с примером JPA, приведенным в ссылке ниже, вам необходимо установить родительский объект в дочернем. Вы можете сделать это в родительском классе (дочерний метод получения)

http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы