#java #hibernate
#java #спящий режим
Вопрос:
У меня есть структуры данных, отображенные в режиме гибернации, и при попытке ее удаления возникает ошибка.
@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, я вижу, что спящий режим удаляет объекты из таблиц ТИПОВ. Почему он пытается удалить объекты типа, если есть ссылка 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>();
…
}
Цепочка: Информация-> Подробности-> Книги. Каждая книга имеет тип, возможно, что многие книги имеют один и тот же тип. Я не хочу удалять объекты типа, когда я удаляю информационные объекты.
Комментарии:
1. Выполнено. Оно включено в информацию о родительском объекте, и я удаляю родительский объект.
2. Извините, добавлена полная иерархия в конец сообщения.
3. Кстати, та же ошибка, когда я пытаюсь напрямую удалить book objct.
4. Вы пробовали использовать
@ManyToOne(cascade = {}, optional = false)
дляBook
->Type
ассоциации? Кажется, что это каким-то образом каскадное удалениеType
. Можете ли вы увидеть что-нибудь связанное в журналах гибернации? Кстати, по умолчанию используется нетерпеливая выборка@ManyToOne
.5. Xavi, ваше решение с {} не работает, я получаю ту же ошибку. Это каскадное удаление, но я не понимаю, почему оно запускается. Многие книги могут иметь один и тот же тип (@ManyToOne) почему спящий режим удаляет тип, когда я удаляю книгу?