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

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

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);

person Risu    schedule 22.07.2014    source источник
comment
Спасибо за вашу ссылку, однако я не вижу, как она помогает ответить на мой вопрос. Это двунаправленная связь, как показано в коде.   -  person Risu    schedule 23.07.2014
comment
это было вернуться к вашему вопросу Did something change, or am I doing something wrong? Таким образом, ответ, вы не пропали без вести. Вот так это должно быть реализовано. Однако вы можете сделать его однонаправленным и добавлять/удалять их по отдельности. Это ваш выбор (на мой взгляд).   -  person pms    schedule 23.07.2014
comment
Простите мою путаницу, но вы говорите, что r.getNights().add(new Night()); (до редактирования) должно работать, чтобы сохранить ассоциацию?   -  person Risu    schedule 23.07.2014
comment
Извини, я виноват. Да, вам нужно установить родительский объект в дочернем. Вы можете сделать это в родительском классе (дочерний метод получения).   -  person pms    schedule 23.07.2014
comment
Итак, после редактирования это то, что должно быть, а до редактирования было просто какое-то автоматическое волшебство, на которое я не должен был полагаться. Правильный?   -  person Risu    schedule 23.07.2014
comment
Извините, я не понял вашего вопроса.   -  person pms    schedule 23.07.2014
comment
Чтобы уточнить: я делал это неправильно. Верно?   -  person Risu    schedule 23.07.2014
comment
Правильно. Это работало в вашем предыдущем проекте? Потому что AFAIK не должен работать должным образом.   -  person pms    schedule 23.07.2014
comment
Да, но это были JPA 1 и Hibernate 3.   -  person Risu    schedule 23.07.2014
comment
Спасибо за помощь. Вы хотели написать ответ, который я могу принять, чтобы вы могли получить баллы?   -  person Risu    schedule 23.07.2014


Ответы (1)


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

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

person pms    schedule 22.07.2014