映射学习笔记

阅读更多

1.N-1映射示例:

假设有两张表,建立主外键关联

 

员工<--->部门

员工 Domain:

private Integer id;	
private String name;
private Department dept;

员工Hibernate配置:


		
			
			
				id_inc
			
		
		
			
		
		
		
			
		
	

部门Domain:

private Integer id;
private String name;

 部门hbm

	
		
			
			
				id_inc
			
		
		
			
		
	
Department dept1 = new Department();
Department dept2 = new Department();
dept1.setName("财务");
dept2.setName("后勤");
Student st1 = new Student();
Student st2 = new Student();
st1.setName("风姿");
st2.setName("导师");
st1.setDept(dept1);
st2.setDept(dept1);
session.save(dept1);
session.save(dept2);
session.save(st1);
session.save(st2);
trans.commit();

2.one-to-many映射

当需要查询出一个部门中有多少个学生的情况下需要配置:

Department:
private Set stu;
	public Set getStu() {
		return stu;
	}
	public void setStu(Set stu) {
		this.stu = stu;
	}

 相应的hbm.xml文件为:



	
	

测试:

 

1.
//查询一个部门中有多少名学生
Department dept1 = (Department) session.get(Department.class, 3);
Set set = dept1.getStu();
for(Student s:set){
	System.out.println("student:"+s.getName());
}
2.
Department department=new Department();
department.setName("业务部门");

Student stu1=new Student();
stu1.setName("顺平");
Student stu2=new Student();
stu2.setName("小明");

Set sets=new HashSet();
sets.add(stu1);
sets.add(stu2);
department.setStu(sets);
session.save(stu1);
session.save(stu2);
session.save(department);

 其中在测试的过程中一直出现一个错误:

org.hibernate.InvalidMappingException: Could not parse mapping document from resource 

后来发现hibernate.config.xml中配置了:

 




 可能是名称相同互相干扰的原因,去掉不相干的一组后可以正常测试!

3.one-to-one主键一对一关联

案例:一个人对应一个身份证

 

private Integer id;
private String name;
private Idcard idcard;

 

 

private Integer id;
private Date date;
private Person person;

 

 采用手动分配主键策略

 


	
		
		
			id_inc
		
	
	
		
	
	

 设置外键,从而是Person中的id与Idcard中id保持一致

 

class name="Idcard" table="idcard_db">
	
		
			person
		
	
	
		
	
	

 测试:

 

        Person p1=new Person();
	p1.setId(1);
	p1.setName("jk");
	Idcard idCard=new Idcard();
	idCard.setDate(new Date());
	idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
	session.save(p1);//先保存人
	session.save(idCard);

4.one-to-one基于外键

这样设置的话,那么idcard_db表中就会多一个person的id列

 


	
		
		
	
	
		
	
	

 测试:

 

			Person p1=new Person();
			p1.setId(1);
			p1.setName("jk");
			Idcard idCard=new Idcard();
			idCard.setId(1234);
			idCard.setDate(new Date());
			idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
			session.save(p1);//先保存人
			session.save(idCard);

5.many-to-many

这个映射关系一般很难表示,可以拆分为多对一或者一对多,一对一的组合

例如学生与课程之间的关系为多对多关系

可以建立一个学生课程表作为学生表与课程表的中间表

那么这样,学生与学生课程表之间就是一对多关系,课程与学生课程表之间也是一对多关系。

学生Domain设计:

 

	private Integer id;
	private String name;
	private Set stuCourse;

学生hbm配置,因为有一个一对多关系,所以要把Set映射到hbm文件中:

 

	
		
			
			
				id_inc
			
		
		
			
		
		
			
			
			
		
	
课程Domain,与学生Domain类似:
	private Integer id;
	private String name;
	private Set stuCourse;
对应的hbm文件:
	
		
			
			
				id_inc
			
		
		
			
		
		
			
			
			
		
	
 学生课程表:
	private Integer id;
	private Student stu;
	private Course course;
	private Integer grade;
 该表与学生表和课程表关系均为多对一关系,所以配置文件为:
	
		
			
			
				id_inc
			
		
		
			
		
		
		
	
 注意的是,学生课程表中many-to-one中的column作为学生和课程表中外键来使用。
 

 

你可能感兴趣的:(hibernate映射,one-to-many,many-to-one,one-to-one,many-to-many)