объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом - PullRequest
505 голосов
/ 20 февраля 2010

Я получаю следующую ошибку при сохранении объекта с помощью Hibernate

object references an unsaved transient instance - save the transient instance before flushing

Ответы [ 24 ]

3 голосов
/ 05 января 2016

я получаю эту ошибку при использовании

getSession().save(object)

но это работает без проблем при использовании

getSession().saveOrUpdate(object) 
3 голосов
/ 23 ноября 2016

помимо всех других хороших ответов, это может произойти, если вы используете merge для сохранения объекта и случайно забудете использовать объединенную ссылку на объект в родительском классе. рассмотрим следующий пример

merge(A);
B.setA(A);
persist(B);

В этом случае вы объединяете A, но забываете использовать объединенный объект A. Чтобы решить проблему, вы должны переписать код следующим образом.

A=merge(A);//difference is here
B.setA(A);
persist(B);
2 голосов
/ 22 июля 2018

Я тоже сталкивался с такой же ситуацией. Установив следующую аннотацию над свойством, оно решает вопрос об исключении.

Исключение, с которым я столкнулся.

Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.model.Car_OneToMany

Чтобы преодолеть аннотацию, которую я использовал.

    @OneToMany(cascade = {CascadeType.ALL})
    @Column(name = "ListOfCarsDrivenByDriver")
    private List<Car_OneToMany> listOfCarsBeingDriven = new ArrayList<Car_OneToMany>();

Что заставило Hibernate выдать исключение:

Это исключение выдается на вашей консоли, потому что дочерний объект, который я присоединяю к родительскому объекту, в данный момент отсутствует в базе данных.

Предоставляя @OneToMany(cascade = {CascadeType.ALL}), он сообщает Hibernate сохранить их в базу данных при сохранении родительского объекта.

1 голос
/ 23 января 2019

Эта проблема возникла у меня, когда я создал новый объект и связанный объект в методе, помеченном как @Transactional, а затем выполнил запрос перед сохранением. Ex

@Transactional
public someService() {
    Entity someEntity = new Entity();
    AssocaiatedEntity associatedEntity = new AssocaitedEntity();
    someEntity.setAssociatedEntity(associatedEntity);
    associatedEntity.setEntity(someEntity);

    // Performing any query was causing hibernate to attempt to persist the new entity. It would then throw an exception
    someDao.getSomething();

    entityDao.create(someEntity);
}

Чтобы исправить, я выполнил запрос перед созданием новой сущности.

1 голос
/ 13 февраля 2018

Ради полноты: А

org.hibernate.TransientPropertyValueException 

с сообщением

object references an unsaved transient instance - save the transient instance before flushing

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

1 голос
/ 10 февраля 2018

Если вы используете Spring Data JPA, то добавление аннотации @Transactional к реализации вашего сервиса решит проблему.

1 голос
/ 13 июня 2016

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

Код был примерно таким в модели User.java:

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.setNewPassword(password);
this.timeJoin = new Date();
create();

Метод setNewPassword () создает запись PasswordHistory и добавляет ее в коллекцию истории в User. Поскольку оператор create () еще не был выполнен для родительского объекта, он пытался сохранить в коллекции сущность, которая еще не была создана. Все, что мне нужно было сделать, чтобы это исправить, это переместить вызов setNewPassword () после вызова create ().

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.timeJoin = new Date();
create();
this.setNewPassword(password);
1 голос
/ 30 ноября 2016

Существует еще одна возможность, которая может вызвать эту ошибку в спящем режиме. Вы можете установить несохраненную ссылку вашего объекта A на присоединенную сущность B и хотите сохранить объект C. Даже в этом случае вы получите вышеупомянутую ошибку.

0 голосов
/ 31 мая 2018

Случай 1: Я получал это исключение, когда пытался создать родителя и сохранить эту родительскую ссылку на его потомка, а затем какой-нибудь другой запрос DELETE / UPDATE (JPQL). Поэтому я просто сбрасываю () вновь созданную сущность после создания родителя и после создания дочернего элемента, используя ту же родительскую ссылку. Это сработало для меня.

Дело 2:

Родительский класс

public class Reference implements Serializable {

    @Id
    @Column(precision=20, scale=0)
    private BigInteger id;

    @Temporal(TemporalType.TIMESTAMP)
    private Date modifiedOn;

    @OneToOne(mappedBy="reference")
    private ReferenceAdditionalDetails refAddDetails;
    . 
    .
    .
}

Детский класс:

public class ReferenceAdditionalDetails implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @OneToOne
    @JoinColumn(name="reference",referencedColumnName="id")
    private Reference reference;

    private String preferedSector1;
    private String preferedSector2;
    .
    .

}

В вышеприведенном случае, когда родитель (Reference) и потомок (ReferenceAdditionalDetails) имеют отношение OneToOne, и когда вы пытаетесь создать объект Reference, а затем его дочерний объект (ReferenceAdditionalDetails), он выдаст вам одно и то же исключение. Поэтому, чтобы избежать исключения, вы должны установить значение NULL для дочернего класса, а затем создать родительский. (Пример кода)

.
.
reference.setRefAddDetails(null);
reference = referenceDao.create(reference);
entityManager.flush();
.
.
0 голосов
/ 10 апреля 2018

Я думаю, это потому, что вы пытаетесь сохранить объект, который имеет ссылку на другой объект, который еще не существует, и поэтому он пытается на стороне «БД» поместить ссылку на строку, которая не существует

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