2016-12-05 3 views
0

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

объекта ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой: Кандидаты; вложенное исключение java.lang.IllegalStateException: org.hibernate.TransientObjectException: объект ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой: Кандидаты объекта ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой

в org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible (EntityManagerFactoryUtils.java:381) на org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible (HibernateJpaDialect.java:227) на org.springframework.orm .jpa.JpaTransactionManager.doCommit (JpaTransactionManager.java:521) на org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit (AbstractPlatformTransactionManager.java:761) на org.springframework.transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager.java:730) на org.springframework.transaction .interceptor.TransactionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:485) на org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:291) на org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor .java: 96) по адресу org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) на org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:136) на org.springframework.aop.framework .ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) на org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:131) в org.springframework.aop.framework.ReflectiveMethodInvocation .proceed (ReflectiveMethodInvocation.java:179) по адресу org.springframe work.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:92) на org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) на org.springframework.aop.framework.JdkDynamicAopProxy. вызывать (JdkDynamicAopProxy.java:208) на com.sun.proxy. $ Proxy180.save (Unknown Source)

у меня есть 2 объект класса Employee.java (t_employee) и Nominee.java (t_nominee), где у сотрудника может быть много номинантов, поэтому я создал таблицу ассоциаций под названием ta_empl_nom (я хотел как сама таблица ассоциаций, потому что позже у меня может быть опция li nking других сотрудников существующему кандидату)

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

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

Вот сущностей классы Employee.java

@Entity 
@Table(name = "t_employee") 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    @Column(name = "name") 
    private String name; 

@ElementCollection(fetch = FetchType.LAZY) 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "ta_emp_nom", joinColumns = @JoinColumn(name = "employee"), inverseJoinColumns = @JoinColumn(name = "nominee")) 
    @MapKey(name = "name") 
    private Map<String, Nominee> nomineeMap; 

//getters and setters 

} 

Здесь Номинант объект класса Nominee.java

@Entity 
@Table(name = "t_nominee") 
public class Nominee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @Column(name = "name") 
    private String name; 

// other fields, getters, and setter for them below 
} 

Вот мой уровень службы

Employee emp = new Employee(); 
emp.setName("Rahul"); 
Map<String,Nominee> nomineeMap = new HashMap<>(); 
Nominee nom1 = new Nominee(); 
nom1.setName("nom1"); 
Nominee nom2 = new Nominee(); 
nom1.setName("nom2"); 
nomineeMap.put(nom1.getName(), nom1); 
nomineeMap.put(nom2.getName(), nom2); 
emp.setNominee(nomineeMap); 
employeeRepository.save(emp); //error here while saving this emp obj 

I я получаю сообщение об ошибке при сохранении.

+0

Попробуйте удалить '@ OneToMany' из' Employee'. См. Http://stackoverflow.com/questions/19428351/jpa-cascade-persistence-with-entity-elementcollection-keys – Arthur

ответ

0

Возможно, вы обновляете запись, когда вы должны создавать ее в настойчивости, потому что она новая. Таким образом, используйте свой Entity Manager для выполнения persist в объекте и любом его внешнем ключе.

0

Ваш ответ уже указан в первой строке исключения. Вероятно, вы просто сохранили объект в сеансе, но не зафиксировали сцепление. Все остальные части верны, просто зафиксируйте транзакцию. Убедитесь, что вы сопоставили оба класса Entity в файле конфигурации hibernate, и вся конфигурация выполнена правильно. Теперь ваш метод сохранения должен выглядеть так. [Я создал SessionFactory объект здесь, но вы должны создать только один объект для базы данных в целом по проекту.]

SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
    Session session = null; 
    Transaction transaction = null; 
    try { 

     session = sessionFactory.openSession(); 
     transaction = session.beginTransaction(); 
     Employee emp = new Employee(); 
     emp.setName("Rahul"); 
     Map<String, Nominee> nomineeMap = new HashMap<>(); 
     Nominee nom1 = new Nominee(); 
     nom1.setName("nom1"); 
     Nominee nom2 = new Nominee(); 
     nom1.setName("nom2"); 
     nomineeMap.put(nom1.getName(), nom1); 
     nomineeMap.put(nom2.getName(), nom2); 
     emp.setNomineeMap(nomineeMap); 
     session.save(emp); 
     transaction.commit(); 
    } catch (Exception e) { 

     if (transaction != null) { 
      transaction.rollback(); 
     } 
    } finally { 

     session.close(); 
     sessionFactory.close(); 
    } 
Смежные вопросы