`
max1487
  • 浏览: 102551 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

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<Right> 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<Right> getRights() {
		return rights;
	}
	public void setRights(List<Right> 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<Role> 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<Role> getRoles() {
		return roles;
	}
	public void setRoles(List<Role> 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实体配置:

 

 

<class name="Role" lazy="true" table="SYS_ROLE">
	
	
		<id name="role_id">
			<generator class="uuid" />
		</id>
		
		<property name="role_name"></property>
		<property name="cre_time"></property>
		<property name="parent_id"></property>
		<property name="describe"></property>
		<property name="sort"></property>
	
		<bag name="rights" table="role_right">
                    <key column="role_id"/>
                    <many-to-many class="Right" column="right_id"/>
                </bag> 
		
		</class>

 Right实体配置:

 

 

<class name="Right" lazy="true" table="SYS_RIGHTS">
	
	
		<id name="right_id">
			<generator class="uuid" />
		</id>
		
		<property name="right_name"></property>
		<property name="url"></property>
		<property name="parent_id"></property>
		<property name="lev"></property>
		<property name="sort"></property>
	
		<bag name="roles" table="role_right">
            <key column="right_id"/>
            <many-to-many class="Role" column="role_id"/>
        </bag> 
		
</class>




 

 

 二、

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

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

Student类:

 

public class Student {

	private String id;
	private String name;

	private List<Score> 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<Score> getScoreList() {
		return scoreList;
	}
	public void setScoreList(List<Score> 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<Score> 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<Score> getScoreList() {
		return scoreList;
	}
	public void setScoreList(List<Score> 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实体配置:

 

<class name="Student" lazy="true" table="student">

		<id name="id">
			<generator class="uuid" />
		</id>
		<property name="name"></property>
		<bag name="scoreList">
	        <key column="student"/>
	        <one-to-many class="Score"/>
   		 </bag>
		
	</class>

 Course实体配置:

 

<class name="Course" lazy="true" table="course">
		<id name="id">
			<generator class="uuid" />
		</id>
		<property name="name"></property>
		<bag name="scoreList">
	        <key column="course"/>
	        <one-to-many class="Score"/>
   		</bag>
		
	</class>

 

Score实体配置:

<class name="Score" lazy="true" table="score">
		<id name="id">
			<generator class="uuid" />
		</id>
		<property name="score"></property>
		<many-to-one name="student" column="student" ></many-to-one>
    	        <many-to-one name="course" column="course" ></many-to-one>
</class>

 

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

<class name="Score" lazy="true" table="score">
		<composite-id>
			<key-many-to-one name="student" column="student"></key-many-to-one>
			<key-many-to-one name="course" column="course"></key-many-to-one>
		</composite-id>
		<property name="score"></property>
</class>

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics