org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: cn.edu.hust.job.data.entity.Sex; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.edu.hust.job.data.entity.Sex
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:634)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:728)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:604)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
at cn.edu.hust.job.user.dao.GraduateDao$$EnhancerByCGLIB$$c41435dd.save(<generated>)
at cn.edu.hust.job.graduate.service.GraduateServiceImpl.save(GraduateServiceImpl.java:106)
at cn.edu.hust.job.graduate.action.StudentInfoAction.importDoctorStudent(StudentInfoAction.java:931)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.edu.hust.job.data.entity.Sex
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:242)
at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:597)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3128)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:479)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:204)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:127)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:596)
... 88 more
上面那是这是部分报错信息[code=Jav]Student student = new Student();
Sex sex = new Sex();
sex.setName("nan");
student.setSex(sex);
System.out.println("name--------------------"+student.getSex().getName());

student.setStudentNum(sheet.getCell(0, i).getContents().trim());
StudentType studenttype = new StudentType();
studenttype.setName(sheet.getCell(1, i).getContents().trim());
student.setStudentType(studenttype);
student.setName(sheet.getCell(2, i).getContents().trim());
student.setExamNum(sheet.getCell(3, i).getContents().trim());
Department d = new Department();
d.setName(sheet.getCell(4, i).getContents().trim());
student.setDepartment(d);
student.setGraduateTime(new Date(Long.valueOf(sheet.getCell(5, i).getContents().trim())));
Major m = new Major();
m.setName(sheet.getCell(6, i).getContents().trim());
student.setMajor(m);
Clazz c = new Clazz();
c.setNumber(sheet.getCell(7, i).getContents().trim().substring(
sheet.getCell(7, i).getContents().trim().length() - 3,
sheet.getCell(7, i).getContents().trim().length() - 1));
student.setClazz(c);
Cultivate cu = new Cultivate();
cu.setName(sheet.getCell(8, i).getContents().trim());
student.setCultivate(cu);
student.setSchoolingLength(Integer.parseInt(sheet.getCell(9, i).getContents().trim()));
student.setForeignLanguage(sheet.getCell(10, i).getContents().trim());
Sex se = new Sex();
se.setName(sheet.getCell(11, i).getContents().trim());
student.setSex(se);
Political p = new Political();
p.setName(sheet.getCell(12, i).getContents().trim());
student.setPolitical(p);
Nation n = new Nation();
n.setName(sheet.getCell(13, i).getContents().trim());
student.setNation(n);
student.setBirthday(new Date(Long.valueOf(sheet.getCell(14,i).getContents().trim())));
student.setCardId(sheet.getCell(15, i).getContents().trim());
student.setEnterTime(new Date(Long.valueOf(sheet.getCell(16, i).getContents().trim())));
Location l = new Location();
l.setBack_hkqydz(sheet.getCell(17, i).getContents().trim());
student.setSource(l);

studentService.save(student);[/code]
上面这是Java代码,Student 是一个实体对象,Sex ,Major,Clazz ,Department....等等是她的属性,当然也有一些基本数据类型的属性。
[code=Jav]
@Entity
@Table(name = "XS")
public class Student extends User { public  PrivilegeRole getPrivilegeRole(){
if(this.isMonitor()){
return PrivilegeRole.MONITOR;
}
return PrivilegeRole.STUDENT;
}

@Column(name = "XH")
private String studentNum;// 学号 @Column(name = "KSH")
private String examNum; // 考生号 @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "XLFL")
private StudentType studentType; @Column(name = "SFBYS")
private Boolean graduate = true;// 是否毕业生(判断其能否登陆本系统) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "YXID")
private Department department;// 院系 @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ZYID")
private Major major;// 专业 @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BJ")
public Clazz clazz;// 班级[/code]这是实体类的部分代码,有get(),set() 方法,这样的报错怎么解决?
之前查了资料说是在注解中使用@ManyToOne(cascade={CascadeType.SAVE_UPDATE,CascadeType.PERSIST})
可是报了数据类型转换的错误,说CascadeType不能转换为CascadeType ,
求助各位大虾了!!!!!!!!!!!!困扰几天了啊啊啊 啊啊啊啊。

解决方案 »

  1.   

    org.springframework.dao.InvalidDataAccessApiUsageException:对象引用一个未保存的瞬态的实例 - 保存前冲洗瞬态的实例:cn.edu.hust.job.data.entity.Sex;嵌套异常是org.hibernate.TransientObjectException:对象引用一个未保存的瞬间实例 - 之前保存冲洗瞬态的实例:cn.edu.hust.job.data.entity.Sex
      

  2.   

    object references an unsaved transient instance - save the transient instance before flushing
    说明你的对象引用了一个未保存的对象
    应该是延迟加载的问题~~
      

  3.   

    你的student实体没有主键,,,,,,,,,,,hibernate只能操作有主键的表,,,,,,,,,,
    把student表中添加一个主键 设置成自动增长的,,,,,,,,,或者是不需要自动增长,,,,,,,,,,,但是添加的时候需要设置student的主键值,,,,,,,,,,,,
     才可以添加的,,,,,,,,
      

  4.   

    先有表,我做的是批量导入。
    这个项目有点纠结,这样是可以添加的。本来我把那个注解加上cascade={CascadeType.SAVE_UPDATE,CascadeType.PERSIST}这个之后能添加成功的,但是因为student这个对象跟好多对象都有关联,比如sex,department,major,clazz,cultivate,nation,location,studenttype...这些对象都是有相对应的表或者有几个对象是在同一张表中有记录,只是type不一样而已,也就是说像sex,studenttype,nation...这样的对象,表中事先是有值的,而且还不能添加了,只能引用,甚至是clazz,department,location 这样的字段也不能随便就往数据库中添加值,因为总不可能添加一个学生数据就往班级表中添加一个班级,性别表中添加一个性别,民族表中添加一个民族
    结构有点复杂,不看实际项目说也说不清,所以还是只能自己搞定了,我现在也还在看代码还是谢谢你们了
      

  5.   

    @ManyToOne(fetch = FetchType.LAZY
    再加一个
    cascade配置属性
    这个是负责你增加时的级联自动保存
      

  6.   

    你试图存储一个瞬时状态的对象。
    也就是说,A和B有关联的话,其中A引用B.
    如果你持久化A对象的话,应该先将其关联的B对象先持久化才可以。
    否则就会出现transientObject Exception这个异常。还有一种解决办法是使用cascade级联属性。它是一种操作上的连锁反应,会在你持久化A对象的时候自动将其关联对象持久化。