`
zy77612
  • 浏览: 278624 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HiberNate学习-4 映射关系-多对多

 
阅读更多

1 hibernate多对多关联映射(双向User<---->Role)

映射方法:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

 

一:实体类:

Role.java代码 复制代码 收藏代码
  1. package com.tao.hibernate.many2many2;
  2. import java.util.Set;
  3. public class Role {
  4. private Integer id;
  5. private String name;
  6. private Set<User> users;
  7. public Role() {
  8. super();
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public Set<User> getUsers() {
  23. return users;
  24. }
  25. public void setUsers(Set<User> users) {
  26. this.users = users;
  27. }
  28. }
package com.tao.hibernate.many2many2;

import java.util.Set;

public class Role {
	private Integer id;
	private String name;
	private Set<User> users;

	public Role() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}

}
User.java代码 复制代码 收藏代码
  1. package com.tao.hibernate.many2many2;
  2. import java.util.Set;
  3. public class User {
  4. private Integer id;
  5. private String name;
  6. private Set<Role> roles;
  7. public User() {
  8. super();
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public Set<Role> getRoles() {
  23. return roles;
  24. }
  25. public void setRoles(Set<Role> roles) {
  26. this.roles = roles;
  27. }
  28. }
package com.tao.hibernate.many2many2;

import java.util.Set;

public class User {
	private Integer id;
	private String name;
	private Set<Role> roles;

	public User() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}

二:映射文件:

Role.hbm.xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping package="com.tao.hibernate.many2many2"
  5. auto-import="false">
  6. <class name="Role" table="t_role">
  7. <id name="id" column="id" type="integer">
  8. <generator class="native">
  9. </generator>
  10. </id>
  11. <property name="name" column="name" />
  12. <set name="users" table="t_user_role" order-by="userId">
  13. <key column="roleId" />
  14. <many-to-many class="User" column="userId" />
  15. </set>
  16. </class>
  17. </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.tao.hibernate.many2many2"
	auto-import="false">
	<class name="Role" table="t_role">
		<id name="id" column="id" type="integer">
			<generator class="native">
			</generator>
		</id>
		<property name="name" column="name" />
		<set name="users" table="t_user_role" order-by="userId">
			<key column="roleId" />
			<many-to-many class="User" column="userId" />
		</set>
	</class>
</hibernate-mapping>
User.hbm.xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping package="com.tao.hibernate.many2many2"
  5. auto-import="false">
  6. <class name="User" table="t_user">
  7. <id name="id" column="id" type="integer">
  8. <generator class="native">
  9. </generator>
  10. </id>
  11. <property name="name" column="name" />
  12. <set name="roles" table="t_user_role" cascade="all">
  13. <key column="userId" />
  14. <many-to-many class="Role" column="roleId" />
  15. </set>
  16. </class>
  17. </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.tao.hibernate.many2many2"
	auto-import="false">
	<class name="User" table="t_user">
		<id name="id" column="id" type="integer">
			<generator class="native">
			</generator>
		</id>
		<property name="name" column="name" />
		<set name="roles" table="t_user_role" cascade="all">
			<key column="userId" />
			<many-to-many class="Role" column="roleId" />
		</set>
	</class>
</hibernate-mapping>

三:测试类:

Testmain.java代码 复制代码 收藏代码
  1. package com.tao.hibernate.many2many2;
  2. import java.util.Iterator;
  3. import org.hibernate.Session;
  4. import org.junit.Test;
  5. import com.tao.hibernate.HibernateUtils;
  6. public class TestMain {
  7. Session session = HibernateUtils.getFactory().openSession();
  8. @Test
  9. public void testLoad() {
  10. Session session = HibernateUtils.getFactory().openSession();
  11. Role r1 = (Role) session.load(Role.class, 1);
  12. System.out.println(r1.getName());
  13. for (Iterator<User> iter = r1.getUsers().iterator(); iter.hasNext();) {
  14. System.out.println(iter.next().getName());
  15. }
  16. }
  17. }

 Student.java

Java代码 复制代码 收藏代码
  1. package com.entity;
  2. import java.io.Serializable;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.persistence.Column;
  6. import javax.persistence.Entity;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.Id;
  9. import javax.persistence.ManyToMany;
  10. import javax.persistence.Table;
  11. @Entity
  12. @Table(name = "Student")
  13. publicclass Student implements Serializable {
  14. private Integer studentid;//学生ID
  15. private String studentName;//学生姓名
  16. private Set<Teacher> teachers = new HashSet<Teacher>();//对应的教师集合
  17. public Student() {
  18. }
  19. public Student(String studentName) {
  20. this.studentName = studentName;
  21. }
  22. @Id
  23. @GeneratedValue
  24. public Integer getStudentid() {
  25. return studentid;
  26. }
  27. publicvoid setStudentid(Integer studentid) {
  28. this.studentid = studentid;
  29. }
  30. @Column(nullable = false, length = 32)
  31. public String getStudentName() {
  32. return studentName;
  33. }
  34. publicvoid setStudentName(String studentName) {
  35. this.studentName = studentName;
  36. }
  37. /*
  38. * @ManyToMany 注释表示Student是多对多关系的一边,mappedBy 属性定义了Student 为双向关系的维护端
  39. */
  40. @ManyToMany(mappedBy = "students")
  41. public Set<Teacher> getTeachers() {
  42. return teachers;
  43. }
  44. publicvoid setTeachers(Set<Teacher> teachers) {
  45. this.teachers = teachers;
  46. }
  47. }
package com.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Student")
public class Student implements Serializable {
	
	private Integer studentid;//学生ID
	private String studentName;//学生姓名
	private Set<Teacher> teachers = new HashSet<Teacher>();//对应的教师集合

	public Student() {
	}

	public Student(String studentName) {
		this.studentName = studentName;
	}

	@Id
	@GeneratedValue
	public Integer getStudentid() {
		return studentid;
	}

	public void setStudentid(Integer studentid) {
		this.studentid = studentid;
	}

	@Column(nullable = false, length = 32)
	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
	
	/*
	 * @ManyToMany 注释表示Student是多对多关系的一边,mappedBy 属性定义了Student 为双向关系的维护端
	 */
	@ManyToMany(mappedBy = "students")
	public Set<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
}


多对多的关联的中间表
Teacher.java

Java代码 复制代码 收藏代码
  1. package com.entity;
  2. import java.io.Serializable;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.JoinTable;
  12. import javax.persistence.ManyToMany;
  13. import javax.persistence.Table;
  14. import javax.persistence.JoinColumn;
  15. @Entity
  16. @Table
  17. publicclass Teacher implements Serializable {
  18. private Integer teacherid;// 教师ID
  19. private String teacherName;// 教师姓名
  20. private Set<Student> students = new HashSet<Student>();// 对应的学生集合
  21. public Teacher() {
  22. }
  23. public Teacher(String teacherName) {
  24. this.teacherName = teacherName;
  25. }
  26. @Id
  27. @GeneratedValue
  28. public Integer getTeacherid() {
  29. return teacherid;
  30. }
  31. publicvoid setTeacherid(Integer teacherid) {
  32. this.teacherid = teacherid;
  33. }
  34. @Column(nullable = false, length = 32)
  35. public String getTeacherName() {
  36. return teacherName;
  37. }
  38. publicvoid setTeacherName(String teacherName) {
  39. this.teacherName = teacherName;
  40. }
  41. /*
  42. * @ManyToMany 注释表示Teacher 是多对多关系的一端。
  43. * @JoinTable 描述了多对多关系的数据表关系,name属性指定中间表名称。
  44. * joinColumns 定义中间表与Teacher 表的外键关系,中间表Teacher_Student的Teacher_ID 列是Teacher 表的主键列对应的外键列。
  45. * inverseJoinColumns 属性定义了中间表与另外一端(Student)的外键关系。
  46. */
  47. @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  48. @JoinTable(name = "Teacher_Student",
  49. joinColumns ={@JoinColumn(name = "teacher_ID", referencedColumnName = "teacherid") },
  50. inverseJoinColumns = { @JoinColumn(name = "student_ID", referencedColumnName = "studentid")
  51. })
  52. public Set<Student> getStudents() {
  53. return students;
  54. }
  55. publicvoid setStudents(Set<Student> students) {
  56. this.students = students;
  57. }
  58. publicvoid addStudent(Student student) {
  59. if (!this.students.contains(student)) {//检测在该散列表中某些键是否映射到指定值,value 查找的值。如果某些键映射到该散列表中的值为true,否则false
  60. this.students.add(student);
  61. }
  62. }
  63. publicvoid removeStudent(Student student) {
  64. this.students.remove(student);
  65. }
  66. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics