使用JPA的CascadeType.Merge时遇到的问题
//学生类
public class Student{
private String s_id;
private ClassRoom classRoom;
//....getter and setter
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.MERGE)
@JoinColumn(name="c_id")
public Class getClassRoom() { return classRoom;}
}
//教室类
public class ClassRoom{
private String c_id;
pricate Set<Student> students = new HashSet<Studnet>(0);
//...getter and setter
}
//测试类
public class Test{
public void test(){
//新建一个教室对象
ClassRoom cr = new ClassRomm();
cr.setC_id("1");
//新建一个学生对象并且关联教室
Student stu = new Student();
stu.setS_id("201501");
stu.setClassRoom(cr);
//调用JPA的persistent方法
entityManager.persistent(stu);
}
}
//异常信息
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ClassRoom -> ClassRoom
at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
at org.hibernate.engine.Cascade.cascade(Cascade.java:172)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
... 36 more
请问CascasdeType的Merge是类似与Hibernate的saveOrUpdate吗?本人初学,如果不是,那么哪个才能达到saveorupdate的效果呢?