hibernate多对多配置(配置文件方式)

阅读更多

hibernate多对多关系配置

 

 

       hibernate关系映射配置方式有两种,一种是配置文件方式,一种则是注解配置方式,这次本文讲解的是配置文件的方式。

在hibernate中多对多关系也有两种实现方式:

一、

       第一种,直接配置mang-to-many的多对多关系,这种方式的特点是中间表只有两个字段,分别是两个关联表的主键,而程序中也不会产生中间表的实体。

这里以Role角色-Right权限为例,一个角色有多个权限 ,一个权限也可以被赋予给多个角色。

Role类:

 

public class Role{


	private String role_id;   //角色id
	private String role_name;//角色名称
	private Date cre_time;//创建时间
	private String parent_id;//父级角色 
	private String describe;//描述
	private int sort;//序号
	private List rights;//角色拥有的权限
	

	public String getRole_id() {
		return role_id;
	}
	public void setRole_id(String roleId) {
		role_id = roleId;
	}

	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String roleName) {
		role_name = roleName;
	}

	public Date getCre_time() {
		return cre_time;
	}
	public void setCre_time(Date creTime) {
		cre_time = creTime;
	}

	public String getParent_id() {
		return parent_id;
	}
	public void setParent_id(String parentId) {
		parent_id = parentId;
	}

	public String getDescribe() {
		return describe;
	}
	public void setDescribe(String describe) {
		this.describe = describe;
	}

	public int getSort() {
		return sort;
	}
	public void setSort(int sort) {
		this.sort = sort;
	}
	
	public List getRights() {
		return rights;
	}
	public void setRights(List rights) {
		this.rights = rights;
	}
	@Override
	public String toString() {
		return "Role [cre_time=" + cre_time + ", describe=" + describe
				+ ", parent_id=" + parent_id  
				+ ", role_id=" + role_id + ", role_name=" + role_name
				+ ", sort=" + sort + "]";
	}

	
}

Right类:

 

 

 

public class Right{


	private String right_id;//权限id
	private String right_name;//权限名称
	private String url;//权限URL
	private String parent_id;//父级权限
	private int lev;//权限等级
	private int sort;//序号
	
	private List roles;

	public String getRight_id() {
		return right_id;
	}
	public void setRight_id(String rightId) {
		right_id = rightId;
	}

	public String getRight_name() {
		return right_name;
	}
	public void setRight_name(String rightName) {
		right_name = rightName;
	}

	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}


	public String getParent_id() {
		return parent_id;
	}
	public void setParent_id(String parentId) {
		parent_id = parentId;
	}

	public int getLev() {
		return lev;
	}
	public void setLev(int lev) {
		this.lev = lev;
	}
	public int getSort() {
		return sort;
	}
	public void setSort(int sort) {
		this.sort = sort;
	}
	public List getRoles() {
		return roles;
	}
	public void setRoles(List roles) {
		this.roles = roles;
	}
	@Override
	public String toString() {
		return "Right [lev=" + lev + ", parent_id=" + parent_id + ", right_id="
				+ right_id + ", right_name=" + right_name 
				+ ", sort=" + sort + ", url=" + url + "]";
	}


	
	
}

 Role实体配置:

 

 


	
	
		
			
		
		
		
		
		
		
		
	
		
                    
                    
                 
		
		

 Right实体配置:

 

 


	
	
		
			
		
		
		
		
		
		
		
	
		
            
            
         
		





 

 

 二、

       第二种实现方式的特点是程序会产生中间表实体,然后在中间表实体中配置两个mang-to-one即可。

这里以学生-成绩-课程举例,成绩类即是中间表实体,记录某一个学生的某一个课程的成绩。在这里第一种方式是不适用于这个例子的,因为第一种方式的中间表只保留两个关联表的主键,而在这里成绩中间表还需要记录学生课程的成绩。

Student类:

 

public class Student {

	private String id;
	private String name;

	private List scoreList;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List getScoreList() {
		return scoreList;
	}
	public void setScoreList(List scoreList) {
		this.scoreList = scoreList;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}
	
	

}

 

 

Course类:

 

public class Course {

	private String id;
	private String name;
	private List scoreList;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public List getScoreList() {
		return scoreList;
	}
	public void setScoreList(List scoreList) {
		this.scoreList = scoreList;
	}
	@Override
	public String toString() {
		return "Course [id=" + id + ", name=" + name + "]";
	}
	
	
}

 

 

Score类:

 

public class Score {

	private String id;//主键id
	private Student student;//学生id
	private Course course;//课程id
	private int score;//成绩
	
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public Course getCourse() {
		return course;
	}
	public void setCourse(Course course) {
		this.course = course;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Score [course=" + course.getName() + ", score=" + score + ", student="
				+ student.getName() + "]";
	}
	
	
}

 

 

Studnet实体配置:

 



		
			
		
		
		
	        
	        
   		 
		
	

 Course实体配置:

 


		
			
		
		
		
	        
	        
   		
		
	

 

Score实体配置:


		
			
		
		
		
    	        

 

最后,第二种方式还有一种可能的情况,比如是学生id 和课程id 作为成绩表的联合主键,这时Score实体配置改动如下:


		
			
			
		
		

 

 

你可能感兴趣的:(java,hibernate)