объект ссылается на несохраненный экземпляр переходного процесса – сохраняет временный экземпляр перед промывкой

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

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

23 Solutions collect form web for “объект ссылается на несохраненный экземпляр переходного процесса – сохраняет временный экземпляр перед промывкой”

Вы должны включить cascade="all" (если используете xml) или cascade=CascadeType.ALL (если использовать annotations) в вашем сопоставлении коллекции.

Это происходит потому, что у вас есть коллекция в вашей сущности, и эта коллекция имеет один или несколько элементов, которых нет в базе данных. Задав указанные выше параметры, вы указываете hibernate сохранять их в базе данных при сохранении их родительского элемента.

Я считаю, что это может быть просто повторный ответ, но для уточнения я получил это на @OneToOne mapping, а также на @OneToMany . В обоих случаях это был тот факт, что объект Child я добавлял в Parent не был сохранен в базе данных. Поэтому, когда я добавил Child в Parent , затем сохранил Parent , Hibernate подбрасывал бы "object references an unsaved transient instance - save the transient instance before flushing" при сохранении родителя.

Добавление в cascade = {CascadeType.ALL} на Parent's для Child решило проблему в обоих случаях. Это спасло Child и Parent .

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

 @OneToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "performancelog_id") public PerformanceLog getPerformanceLog() { return performanceLog; } 

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

У меня была эта проблема, и я не хотел сохранять изменения в указанном объекте, поэтому я хотел, чтобы тип каскада был NONE.

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

Просмотрите все отношения в classе, который вы сохраняете, для разработки связанных объектов (и связанных объектов связанных объектов) и убедитесь, что ID и VERSION установлены во всех объектах дерева объектов.

Или, если вы хотите использовать минимальные «полномочия» (например, если вы не хотите каскадное удаление) для достижения того, что вы хотите, используйте

 import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; ... @Cascade({CascadeType.SAVE_UPDATE}) private Set children; 

В моем случае это было вызвано отсутствием CascadeType на стороне @ManyToOne двунаправленного отношения. Чтобы быть более точным, у меня был CascadeType.ALL на стороне @OneToMany и не было на @ManyToOne . Добавление CascadeType.ALL в @ManyToOne разрешило проблему. Сторона « один-ко-многим» :

 @OneToMany(cascade = CascadeType.ALL, mappedBy="globalConfig", orphanRemoval = true) private SetgcScopeSet; 

Многосторонняя сторона (вызвала проблему)

 @ManyToOne @JoinColumn(name="global_config_id") private GlobalConfig globalConfig; 

Много-к-одному (исправлено добавлением CascadeType.PERSIST )

 @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name="global_config_id") private GlobalConfig globalConfig; 

Это произошло для меня при сохранении объекта, в котором существующая запись в базе данных имела значение NULL для поля, аннотированного с помощью @Version (для оптимистической блокировки). Обновление значения NULL до 0 в базе данных исправило это.

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

 X x2 = new X(); x.setXid(memberid); // Error happened here - x was a previous global entity I created earlier Y.setX(x2); 

Я обнаружил ошибку, обнаружив точно, какая переменная вызвала ошибку (в данном случае String xid ). Я использовал catch вокруг всего блока кода, который сохранил объект и напечатал трассировку.

 { code block that performed the operation } catch (Exception e) { e.printStackTrace(); // put a break-point here and inspect the 'e' return ERROR; } 

Если ваша коллекция является object.SetYouColection(null); просто попробуйте: object.SetYouColection(null);

Не используйте Cascade.All пока вам это не Cascade.All . Role и Permission имеют двунаправленное отношение manyToMany . Тогда следующий код будет работать нормально

  Permission p = new Permission(); p.setName("help"); Permission p2 = new Permission(); p2.setName("self_info"); p = (Permission)crudRepository.save(p); // returned p has id filled in. p2 = (Permission)crudRepository.save(p2); // so does p2. Role role = new Role(); role.setAvailable(true); role.setDescription("a test role"); role.setRole("admin"); List pList = new ArrayList(); pList.add(p); pList.add(p2); role.setPermissions(pList); crudRepository.save(role); 

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

Чтобы добавить мои 2 цента, у меня возникла такая же проблема, когда я случайно отправляю null в качестве идентификатора. Ниже кода изображен мой сценарий (и ОП не упоминает какой-либо конкретный сценарий) .

 Employee emp = new Employee(); emp.setDept(new Dept(deptId)); // --> when deptId PKID is null, same error will be thrown // calls to other setters... em.persist(emp); 

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

В некоторых сценариях deptId PKID приходит как null от метода вызова, и я получаю ту же ошибку.

Итак, следите за null значениями для PK ID

я получаю эту ошибку, когда я использую

 getSession().save(object) 

но он работает без проблем, когда я использую

 getSession().saveOrUpdate(object) 

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

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

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

 A=merge(A);//difference is here B.setA(A); persist(B); 

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

Код был что-то вроде этого в модели 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); 

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

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

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

 org.hibernate.TransientPropertyValueException 

с сообщением

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

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

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

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

 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 listOfCarsBeingDriven = new ArrayList(); 

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

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

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

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

Ниже простого рассмотрения отношений один к одному

 insert into Department (name, numOfemp, Depno) values (?, ?, ?) Hibernate: insert into Employee (SSN, dep_Depno, firstName, lastName, middleName, empno) values (?, ?, ?, ?, ?, ?) Session session=sf.openSession(); session.beginTransaction(); session.save(dep); session.save(emp); 

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

 Department dept = (Department)session.load(Department.class, dept_code); // dept_code is from the jsp form which you get in the controller with @RequestParam String department employee.setDepartment(dept); 

Есть так много возможностей этой ошибки, некоторые другие возможности также находятся на странице добавления или редактирования страницы. В моем случае я пытался сохранить объект AdvanceSalary. Проблема в том, что в редакции AdvanceSalary employee.employee_id имеет значение null. Поскольку при редактировании я не был установлен employee.employee_id. Я создал скрытое поле и установил его. мой код работает абсолютно нормально.

  @Entity(name = "ic_advance_salary") @Table(name = "ic_advance_salary") public class AdvanceSalary extends BaseDO{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "employee_id", nullable = false) private Employee employee; @Column(name = "employee_id", insertable=false, updatable=false) @NotNull(message="Please enter employee Id") private Long employee_id; @Column(name = "advance_date") @DateTimeFormat(pattern = "dd-MMM-yyyy") @NotNull(message="Please enter advance date") private Date advance_date; @Column(name = "amount") @NotNull(message="Please enter Paid Amount") private Double amount; @Column(name = "cheque_date") @DateTimeFormat(pattern = "dd-MMM-yyyy") private Date cheque_date; @Column(name = "cheque_no") private String cheque_no; @Column(name = "remarks") private String remarks; public AdvanceSalary() { } public AdvanceSalary(Integer advance_salary_id) { this.id = advance_salary_id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Employee getEmployee() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } public Long getEmployee_id() { return employee_id; } public void setEmployee_id(Long employee_id) { this.employee_id = employee_id; } } 

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

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

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

Случай 2:

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

 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; . . } 

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

 . . reference.setRefAddDetails(null); reference = referenceDao.create(reference); entityManager.flush(); . . 
  • Как ускорить объединение нагрузки без дублирования в NHibernate?
  • Нужны ли мне элементы в файле persistence.xml?
  • Автоматическое резервирование зарезервированного слова для таблиц и столбцов Hibernate
  • org.hibernate.MappingException: Не удалось определить тип для: java.util.List, at table: College, для столбцов:
  • LINQ To Entities не распознает метод Last. В самом деле?
  • В чем разница между однонаправленными и двунаправленными ассоциациями JPA и Hibernate?
  • Как вы можете делать пейджинг с NHibernate?
  • JPA: как иметь отношение «один ко многим» одного и того же типа Entity
  • Классы classов Hibernate должны быть Serializable?
  • Я обнаружил, что JPA, или, похоже, не поощряет шаблон DAO
  • Entity Framework Code First - два внешних ключа из одной таблицы
  • Interesting Posts

    Есть ли способ для виртуализации Mac OSX в Windows?

    Преобразование равномерного распределения в нормальное распределение

    Auctex View работает или не зависит от того, как я запустил Emacs

    Ошибка: выбор не содержит основного типа

    Найти наиболее распространенный элемент в списке

    Сбой и ожидающие обновления: «перезагрузите компьютер для установки важных обновлений»?

    Изменение сочетания клавиш для переключения приложений в OS X

    Windows threading: _beginthread vs _beginthreadex vs CreateThread C ++

    Удаленное включение или перезагрузка замороженного компьютера

    Имеет ли ASP.NET MVC переменные приложения?

    Разрешен размер массива во время выполнения без динамического распределения?

    commandButton / commandLink / ajax action / listener метод не вызывается или входное значение не установлено / обновлено

    Должен ли один вызов .close () на HttpServletResponse.getOutputStream () /. GetWriter ()?

    Excel: как создать несколько строк из одного

    Как решить атаки DDOS в Windows Server 2008 R2 / Windows Server 2012?

    Давайте будем гением компьютера.