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】创建表时不能生成外键

hibernate对于mysql版本使用的方言有所不同。

hibernate中如何向关联表中插入数据,或者更新关联表数据

private Integer ssId; private Students students; private Studytime studytime; private Project pro...

Hibernnate单向一对多映射,多对一映射

我们大家都知道,在域模型(实体域)中,关联关系是类与类之间最普遍的关系,他是指通过一个对象持有另一个对象的实例根据UML语言,关系是有方向的。实质上关联映射的本质:将关联关系映射到数据库,所谓的关联关...

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

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

hibernate annotation方式配置实体关联关系,解决关联外键数据不存在时抛出异常的问题

 使用hibernate 注解配置实体类的关联关系,在many-to-one,one-to-one关联中,一边引用自另一边的属性,如果属性值为某某的数据在数据库不存在了,hibernate默认会抛出异...
  • hardwin
  • hardwin
  • 2009年07月08日 12:41
  • 6890

Hibernate OneToOne双向关联为什么没有外键的一方不能Lazy加载?

关联关系映射通常情况是比较难配置正确的。我觉得真正要掌握好Hibernate应该用OO思想来思考问题。就是要在配置过程,以实体对象为核心,关联到数据库,这个方向是不能反,非常重要的。      ...

Hibernate 一对多外键单向关联

Hibernate 一对多外键单向关联         这种情况很少见,但Hibernate同样允许采用连接表关联1-1.有连接表的1-1同样只需要将N-...

android 中向手机端安装apk 的时候报出 INSTALL_FAILED_INSUFFICIENT_STORAGE 错误的解决方法

INSTALL_FAILED_INSUFFICIENT_STORAGE 字面意思是:由于存储空间不足导致安装失败 我们的应用程序一般是安装到TF卡空间中。首先我想到的便是检查一下TF卡空间,发现还有...

使用pyinstaller打包成exe之后运行闪退,调试后报出 Unable to acquire Oracle environment handle错误解决方法

不管在什么地方,什么时候,学习是快速提升自己的能力的一种体现!!!!!!!!!!! 使用pyinstaller怎么打包我就不多说了,网上可以搜到很多实用的答案. 这里简单阐述下情况: 我想要做的是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
举报原因:
原因补充:

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