У меня есть структуры данных с отображением спящего режима, и при попытке удалить его возникает ошибка.
@Entity
@Table(name = "TYPE")
public class Type {
@Id
private int id;
private String name;
}
@Entity
@Table(name = "BOOKS")
public class Book {
@Id
private int id;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private Type type;
}
Когда я пытаюсь удалить объект Book, я получаю
Caused by: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: com....Book.type; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com...Book.type
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:645)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:846)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:842)
Когда я удаляю необязательный параметр = false, я вижу, что Hibernate удаляет объекты из таблиц TYPES. Почему он пытается удалить объекты типа, если существует ссылка ManyToOne со стороны, противоположной стороне?
Спасибо.
UPD:
Коллекции книг доступны в родительском объекте. Чтобы удалить его, я использую этот код:
Information info = getInformationById(id);
if (info != null) {
getHibernateTemplate().delete(info);
}
upd2 (полная иерархия):
@Entity
@Table(name = "INFO")
public class Information {
@Id
@Column(name = "ID")
private int id;
@Version
private int version;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "INFO_ID")
private Set<Details> details;
...
}
@Entity
@Table(name = "DETAILS")
public class Details {
@Id
private int id;
@Version
private int version;
@Column(name = "INFO_ID")
private int infoId;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "DETAILS_ID", nullable = false)
private Set<Books> books = new HashSet<Book>();
...
}
Цепочка: Инфо-> Детали-> Книги. Каждая книга имеет тип, возможно, что многие книги имеют один и тот же тип. Я не хочу удалять объекты типа, когда я удаляю информационные объекты.