hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法

原创 2012年03月24日 01:17:43
写这篇文章将自己的解决方法保存,好记性,不如烂博客,哈哈。我写了两个类Teacher、Student,其中Teacher是一方,Student是多方,它们的关系通过在student的表中的外键Tech_ID来维护的,要做的功能是在保存一方的同时能保存多方。先贴出正确的代码:
@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一对多双向关联时 删除报错

在设置两个对象一对多和多对一双向关联的时候,删除一方,删除不成功; 主要原因是删除多方的时候,发起了更新多方的sql语句; 修改一方实体类映射文件,如下:...
  • qq_33571718
  • qq_33571718
  • 2017年10月27日 19:35
  • 88

hibernate中双向关联在级联情况下save对象讨论

一般在双向关联的情况下,都要在一方设置mappedBy(name="xxx"),由对方主导映射关系。在多对一的情况下,一般在多的一方设置主导映射的关系(为了方便叙述,就这么叫它了,呵呵)。所谓主导这种...
  • CHEN_JP
  • CHEN_JP
  • 2012年08月30日 15:52
  • 6254

hibernate在没有主外键关系时是如何维护多对一等关联关系的

1.  其实本身hibernate就不是通过数据库的主外键关系去作的关联?(只是一般情况都比较正常:即要关联肯定就是有主外键关系的,所以看上去是数据库建立了主外键关系,hibernate才正常关联,其...
  • xjdAlan
  • xjdAlan
  • 2013年09月05日 18:56
  • 2785

【Hibernate】创建表时不能生成外键

hibernate对于mysql版本使用的方言有所不同。
  • Dongle_74
  • Dongle_74
  • 2017年10月02日 16:56
  • 444

SSh中 一对多关联外键添加,修改保存失败问题

今天博主在做一个ssh项目时候,需要使用到一级分类和二级分类关联,然后是在保存二级分类的时候,二级分类的name可以正常保存,而二级分类关联的一级分类的cid不能插入老是为空。   憋了一天一夜终于把...
  • HGodsun
  • HGodsun
  • 2016年11月10日 14:35
  • 1190

hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法

写这篇文章将自己的解决方法保存,好记性,不如烂博客,哈哈。我写了两个类Teacher、Student,其中Teacher是一方,Student是多方,它们的关系通过在student的表中的外键Tech...
  • lztyll123
  • lztyll123
  • 2012年03月24日 01:17
  • 3288

关于hibernate的一对多ORM映射关系中一方Set<E>中空指针异常解决方案

实体类: @Entity public class Owners { private Integer ownersId; private String ownersName; ...
  • HaleyLiu123
  • HaleyLiu123
  • 2017年04月04日 17:23
  • 456

hibernate 一对多 一对一 ,多方与一方增删改查测试结果

——-------------------------------------------------------------------   关于orcal表结构的外键的onDelete设置,如果...
  • qq_27886997
  • qq_27886997
  • 2017年08月05日 18:32
  • 409

在hibernate中如果一对多关联,并以多的一方的参数作为条件则必须使用

public Data findDiectorByFilmId(Long filmId) { Data rows = directorDao.findRows("select new FilmDi...
  • wxlhdm
  • wxlhdm
  • 2015年06月17日 22:27
  • 750

Hibernate一对多映射配置

PS、inverse与cascade区别 1、inverse表示是否反转控制,默认为false,表示不反转,由本类控制       表现为一方添加时,由inverse="false"的类修改外键列。 ...
  • sw_san
  • sw_san
  • 2016年04月21日 15:50
  • 1923
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
举报原因:
原因补充:

(最多只允许输入30个字)