2014-09-02 3 views
1

Ошибки:объекта Hibernate ссылается несохраненным переходную экземпляра - сохранить переходный экземпляр перед промывкой

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.SomeObject 

Код:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "SOMEOBJECTID", nullable = true, insertable=true, updatable=true) 
public SomeObject getSomeObject() { 
    return this.someObject; 
} 

public void setSomeObject(SomeObject someObject) { 
    this.someObject= someObject; 
} 

У меня есть форма, где SomeObject различных вариантов требуются или нет.

К сожалению, я получаю сообщение об ошибке, как указано выше

Я попытался также CascadeType.ALL, но

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.SomeObject 

Что является причиной? По-видимому, я устанавливаю значение nullable = true (также в базе данных), и хотя у меня есть эта ошибка. Есть идеи?

ответ

2

Предположим, что у вас есть объект Order, имеющий отношение OneToMany к OrderLine. Теперь, если вы не имеете CASCADE набор свойств, то при попытке сохранить Order объект вроде этого:

Order order = new Order(); 
OrderLine orderLine = new OrderLine(); 
order.setOrderLine(orderLine); 
session.save(order); 

, то вы получите исключение говоря:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing 

Чтобы исправить это, вы должны сохранить OrderLine перед сохранением Order:

session.save(orderLine); 
session.save(order); 

Теперь, если у вас есть двунаправленная связь, а также, если вы пытаетесь установить свойство CASCADE и проделать ту же операцию, как это:

Order order = new Order(); 
OrderLine orderLine = new OrderLine(); 
order.setOrderLine(orderLine); 
session.save(orderLine); 
session.save(order); 

, то вы получите исключение, как:

org.hibernate.PropertyValueException: not-null property references a null or transient value 

потому что orderLine имеет свойство для order которое null в этом случае мы имеем не устанавливает значение. Поэтому, чтобы исправить это, вам необходимо правильно поддерживать отношения с обеих сторон, добавив эту дополнительную линию:

orderLine.setOrder(order);