hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
来源:互联网 发布:网络推广计划方案案例 编辑:程序博客网 时间:2024/05/01 05:37
@Entity@Table(name="TEACHERS")@SequenceGenerator(name="SEQ_TEACHERS",sequenceName="SEQ_TEACHERS",allocationSize=1,initialValue=1)public class Teacher {private Long id;private String code;private String name;private String type;private Set<Student> students;@Id@GeneratedValue(generator="SEQ_TEACHERS",strategy=GenerationType.SEQUENCE)@Column(name="id")public Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(name="CODE")public String getCode() {return code;}public void setCode(String code) {this.code = code;}@Column(name="NAME")public String getName() {return name;}public void setName(String name) {this.name = name;}@Column(name="TYPE")public String getType() {return type;}public void setType(String type) {this.type = type;}@OneToMany(fetch=FetchType.EAGER,mappedBy="teacher",cascade=CascadeType.ALL)//@Cascade(value={CascadeType.SAVE_UPDATE})//@JoinColumn(name="TECH_ID")public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
@Entity@Table(name="STUDENTS")@SequenceGenerator(name="SEQ_STUDENTS",sequenceName="SEQ_STUDENTS",allocationSize=1,initialValue=1)public class Student {private Long id;private String code;private String name;//@Column(name="TECH_ID")//private Long techId;private Teacher teacher;@Id@GeneratedValue(generator="SEQ_STUDENTS",strategy=GenerationType.SEQUENCE)@Column(name="id")public Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(name="CODE")public String getCode() {return code;}public void setCode(String code) {this.code = code;}@Column(name="NAME")public String getName() {return name;}public void setName(String name) {this.name = name;}//public Long getTechId() {//return techId;//}//public void setTechId(Long techId) {//this.techId = techId;//}@ManyToOne@JoinColumn(name="TECH_ID")public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}}
public class AssociationsTest {/** * @param args */public static void main(String[] args) {//SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction trans = session.beginTransaction(); Teacher t = new Teacher(); t.setCode("000001"); t.setName("xiaoxue"); t.setType("shuxue"); Set<Student> list = new HashSet<Student>(); Student s0 = new Student(); s0.setCode("000001"); s0.setName("xioali"); s0.setTeacher(t); list.add(s0); Student s1 = new Student(); s1.setCode("000002"); s1.setName("zhangsan"); s1.setTeacher(t); list.add(s1); t.setStudents(list); session.save(t); trans.commit();}}
在写这个功能的时候遇到了不少的问题,真的是不写不知道,写了才知道问题多多啊,先将自己的测试结果贴出:
之前我在测试的时候没有把student的属性teacher赋值,加了以后就没有问题
测试:
1、当我把Cascade从java.persistence转换成hibernate特有的,这样没有影响
2、我将@OneToMany中的mappedby去掉以后,就有问题,报出teachers_students中间表不存在,这个问题一个是因为我的配置文件没有配置自动建表,貌似hibernate默认是通过建中间表来实现一对多的关联关系。
3、在一方(Teacher)中的student集合上的JoinColumn(name='tech_id'),同时将多方(Student)的teacher属性上的注解多去掉,则出现下面的错误:
Exception in thread "main" org.hibernate.MappingException: Could not determine type for: com.myHibernate.vo.Teacher, for columns: [org.hibernate.mapping.Column(teacher)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
at org.hibernate.mapping.Property.isValid(Property.java:185)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:440)
at org.hibernate.mapping.RootClass.validate(RootClass.java:192)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1102)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1287)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at com.myHibernate.test.AssociationsTest.main(AssociationsTest.java:21)
还可以看我的帖子了解情况:hibernate 一对多 帖子
- hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
- hibernate 在多的一方插入数据,发现除了外键,其他字段保存成功
- 在hibernate中如果一对多关联,并以多的一方的参数作为条件则必须使用
- hibernate 一对一、多对一 双向关联的问题——只能在多的一方添加、修改数据,不能在多的一方修改添加
- Hibernate OneToOne双向关联为什么没有外键的一方不能Lazy加载?
- 在测试Hibernate的一对多双向关联映射时
- 一对多,在多的一方设查询条件
- Hibernate的一对多关联
- hibernate 多对一关联 从多的一方取不到一的一方
- 【spring】一般情况下,我们一般建议在一对多双向关联关系中,将一方的inverse属性设置为true
- Hibernate的一对多关联实例
- Hibernate一对多的单向关联
- hibernate一对多单向关联的使用
- Hibernate -- 一对多的双向关联关系
- hibernate的映射:一对多关联关系
- Hibernate,一对多的关联关系
- Hibernate的单向一对多关联
- Hibernate 双向一对多表的关联
- 读《我是一只IT小小鸟》有感
- 自定义LISTVIEW
- windows透明窗口
- (新增一键开启关闭程序)将win7电脑变身WiFi热点(非connectify,APwifi)一种稳定,便捷,网速好的方法,让iphone共享上网!
- Vim Introduction and Tutorial
- hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
- InvocationHandler的invoke方法如何被调用?
- [老老实实学WCF] 第五篇 再探通信--ClientBase
- 开发成本谁更高:Android PK iOS
- 【定径圆覆盖最多点模板】
- Activity生命周期
- MyEclipse中自定义jar包库
- Magento学习资源
- 关于上一篇Android编程获取root权限问题的最终解决与分析