有如下两个实体类 , Student和Grade 为多对一关系。

Student.java

 @Entity
public class Student {
private Integer id;
private String name;
private Grade grade;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name="gradeid")
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
} }

Grade.java

 @Entity
public class Grade { private Integer id;
private String name; @Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }

可以看到Student类的grade属性已经设置了   @ManyToOne(cascade={CascadeType.PERSIST})

但只save Student对象时依然会报 org.hibernate.TransientObjectException 异常,如下:

public class Init {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); Grade g = new Grade();
g.setName("一班"); Student s = new Student();
s.setName("张三");
s.setGrade(g); session.save(s); session.getTransaction().commit(); }
}

运行结果:

Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: accp.hib.Grade

解决办法如下:

方法一:改用persist方法来保存

把session.save(s); 更改为 session.persist(s);

再次保存成功。

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into Grade (name, id) values (?, ?)
Hibernate: insert into Student (gradeid, name, id) values (?, ?, ?)

方法二:使用hibernate的自定义的级联,不要使用jpa的

把Student类grade的注解改为hibernate的注解

@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name="gradeid")

改为:

@ManyToOne

@JoinColumn(name="gradeid")

@Cascade(value={CascadeType.SAVE_UPDATE})

注意,这里的CascadeType和@Cascade都是org.hibernate.annotations包下的,所以把

import javax.persistence.CascadeType;

改为:import org.hibernate.annotations.CascadeType;

并加上:import org.hibernate.annotations.Cascade;

再次保存成功。

最新文章

  1. oracle 12c 加入系统服务
  2. 【转】iOS夯实:ARC时代的内存管理
  3. 初学HTML5、初入前端
  4. HTML 学习笔记 CSS样式(文本)
  5. hibernate-HQL连接查询
  6. (笔记)Linux内核学习(七)之内核同步机制和实现方式
  7. jquery学习笔记1
  8. 'vt100': unknown terminal type.
  9. thinkPHP入门 一
  10. Redmine管理项目3-调整用户显示格式
  11. CountDownLatch使用详解
  12. shell注意事项
  13. Delphi中String类型原理介绍
  14. Interactive map of Linux kernel
  15. Spark mllib多层分类感知器在情感分析中的实际应用
  16. <记录> Ubuntu16.04 安装Redis以及phpredis扩展
  17. TensorFlow常用API汇总
  18. hdu 1069 DAG加权
  19. PHP中的__toString() 是什么东西
  20. 新转移注意(caffe):ImportError: libcudart.so.7.0: cannot open shared object file: No such file or directory

热门文章

  1. SQL Server 添加一条数据获取自动增长列的几种方法
  2. 结构体 + typedef
  3. JAVA byte有无符号数的转换
  4. C# 调用c++报错可能性分析
  5. weblogic启动时报错 java.lang.OutOfMemoryError: PermGen space
  6. Android 屏蔽ScrollView滑动操作
  7. Android 贝塞尔曲线
  8. python核心编程-习题-第二章
  9. C语言基础05
  10. android TextView 垂直滚动 用动画实现