【发布时间】:2023-04-05 01:31:01
【问题描述】:
我收到以下错误,
对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:Nominee;嵌套异常是 java.lang.IllegalStateException: org.hibernate.TransientObjectException: 对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例:Nominee 对象引用未保存的瞬态实例 - 保存瞬态 刷新前的实例
在 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.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 在 com.sun.proxy.$Proxy180.save(未知来源)
我有 2 个实体类 Employee.java (t_employee) 和 Nominee.java(t_nominee),其中一个员工可以有很多被提名人,所以我创建了一个名为 ta_empl_nom 的关联表(我想要作为关联表本身,因为稍后我可以选择将其他员工与现有被提名人联系起来)
所以在这里当我获取员工对象时,我想要以键作为被提名人姓名和对象被提名人本身的被提名人对象的映射。我成功地得到了对象。
但保存时出现问题。当我保存员工对象时,它也应该保存其被提名人的详细信息。
这里是实体类 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 实体类 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
我在保存时收到上述错误消息。
【问题讨论】:
-
尝试从
Employee中删除@OneToMany。见stackoverflow.com/questions/19428351/…
标签: java spring hibernate spring-mvc jpa