Операция @ManyToOne + delete приводит к ошибке «свойство not-null ссылается на нулевое или временное значение» - PullRequest
2 голосов
/ 14 октября 2011

У меня есть структуры данных с отображением спящего режима, и при попытке удалить его возникает ошибка.

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

... }

Цепочка: Инфо-> Детали-> Книги. Каждая книга имеет тип, возможно, что многие книги имеют один и тот же тип. Я не хочу удалять объекты типа, когда я удаляю информационные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...