2016-12-05 80 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) at 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) at 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(来源不明)

我有2个实体类Employee.java(t_employee)和Nominee.java(t_nominee),其中一个员工可以有很多提名人数,所以我创建了一个名为的关联表ta_empl_nom(我想作为关联表本身,因为后来我可能会有选项li让其他员工与现有的被提名人)

所以在这里,当我获取雇员对象时,我想要提名对象的地图作为提名者名称和对象被提名人本身。我成功地获得了这个对象。

但保存时出现问题。当我保存员工对象时,它应该保存其提名细节。

这里是实体类 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 

我在保存时获取上面的错误信息。

+0

尝试从'Employee'删除'@ OneToMany'。见http://stackoverflow.com/questions/19428351/jpa-cascade-persistence-with-entity-elementcollection-keys – Arthur

回答

0

当您应该在持久性中创建记录时,您可能正在更新记录,因为它是新的。因此,使用你的实体经理做坚持在对象和它的任何外键。

0

您的答案已经在例外的第一行中提供。您可能只是在会话中保存了该对象,但没有引起牵引。所有其他部分都是正确的只是提交交易。确保你已经在休眠配置文件中映射了两个实体类,并且所有配置都正确完成。现在你的持久化方法应该是这样的。 [我创建了一个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(); 
    } 
相关问题