Спящая аннотация Каскадная проблема - PullRequest
2 голосов
/ 07 июля 2011

У меня есть класс Java, который содержит список другого класса.

@Entity public class Country {


private Long id;
private List<Hotel> hotels;

public void setId(Long id) {
this.id = id;
}

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COUNTRY_SEQ")
@SequenceGenerator(name="COUNTRY_SEQ", sequenceName="COUNTRY_SEQ", allocationSize=1)
public Long getId() {
return id;
}

public void setHotels(List<Hotel> hotels) {
this.hotels = hotels;
}

@OneToMany
@JoinTable(
    name="COUNTRY_HOTELS",
    joinColumns=@JoinColumn(name="COUNTRY_ID"),
    inverseJoinColumns=@JoinColumn(name="HOTEL_ID")
)
public List<Hotel> getHotels() {
return hotels;
}

}

Когда я пытаюсь удалить Страну, я получаю «ORA-02292: ограничение целостности (HOT.fk1a1e72aaf2b226a) нарушено - найдена дочерняя запись», поскольку она не может удалить Страну, когда ее дети (= Отели) все еще существуют. 1004 *

Однако, СЛЕДУЕТ быть таким! Я не хочу, чтобы мои отели были удалены при удалении страны.

Я пытался без каких-либо @ Каскадных аннотаций, но это не удалось. Я также пытался с SAVE_UPDATE, все еще не удалось. Итак, какие @ Каскадные аннотации мне нужны (или есть другое решение?):

  • PERSIST
  • Мердж
  • УДАЛИТЬ
  • ОБНОВЛЕНИЕ
  • DELETE
  • SAVE_UPDATE
  • REPLICATE
  • DELETE_ORPHAN
  • ЗАМОК
  • выселить

Bart

Ответы [ 3 ]

0 голосов
/ 07 июля 2011

К сожалению, Hibernate пока не поддерживает тип ON DELETE SET NULL каскада. Таким образом, вы должны сначала удалить ссылки вручную и только потом удалять дочернюю сущность.

В Hibernate есть запрос на будущее для его поддержки.

0 голосов
/ 07 июля 2011

Похоже, вы используете Oracle. Это позволяет реализовать каскадное удаление на уровне базы данных путем определения внешнего ключа COUNTRY_ID с помощью ON DELETE CASCADE (http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php).

0 голосов
/ 07 июля 2011

Вы должны удалить отели из списка отелей страны перед удалением страны, чтобы сообщить Hibernate, что у отелей больше нет страны.

...