Hibernate: 关联关系一对多映射
- 一对多单向映射 (Student 获取Class )
- 新建Student 类, Class 类, 设置Id, name; get, set方法
- 在Student 类下增添 private Class c;
- Student.hbm.xml中 添加
-
<many-to-one name="c" column="classId" class="com.base.model.Class"></many-to-one> //多对一
-
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="com.base.model"> 7 8 <class name="Student" table="t_student"> <!-- 类名与对应的数据表名 --> 9 <id name="id" column="stuId"> <!-- 字段名,设置主键 --> 10 <generator class="native"/> 11 </id> 12 <property name="name"/> <!--普通字段 --> 13 14 <many-to-one name="c" column="classId" class="com.base.model.Class"></many-to-one> //多对一 15 </class> 16 17 </hibernate-mapping>
-
- 设置Class.hbm.xml
-
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="com.base.model"> 7 8 <class name="Class" table="t_class"> <!-- 类名与对应的数据表名 --> 9 <id name="id" column="classId"> <!-- 字段名,设置主键 --> 10 <generator class="native"/> 11 </id> 12 <property name="name" column="className"/> <!--普通字段 --> 13 </class> 14 15 </hibernate-mapping>
-
- 添加Hibernate.cfg.xml
- 在<session-factory>标签里添加
-
1 <mapping resource="com/base/model/Student.hbm.xml"/> <!-- xml版使用resource --> 2 <mapping resource="com/base/model/Class.hbm.xml"/> <!-- xml版使用resource -->
- 设置测试类
-
1 public class StudentCalssTest2Test { 2 SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //由于每个步骤都会用到所以移到外面来 3 Session session; 4 @Before 5 public void setUp() throws Exception { 6 session = sessionFactory.openSession(); //生成一个新的session 7 session.beginTransaction(); //开启事物 8 } 9 10 @After 11 public void tearDown() throws Exception { 12 session.getTransaction().commit(); //提交事务 13 session.close(); //关闭session 14 } 15 16 @Test 17 public void testTestAdd() { 18 //简单添加示例 19 Class c = new Class(); 20 c.setName("2013级"); 21 session.save(c); 22 23 Student s1 = new Student(); //创建一个学生 24 s1.setName("zhansan"); //设置名称 25 s1.setC(c); 26 session.save(s1); //保存学生 27 28 Student s2 = new Student(); //创建一个学生 29 s2.setName("李四"); //设置名称 30 s2.setC(c); 31 session.save(s2); //保存学生 32 }
}
-
- 一对多双向映射 (Class 获取Student )
- 使用set集合在Class 类中添加Student 属性
-
1 private Set<Student> students = new HashSet<Student>(); //班级对应的学生
- 添加get set
-
- 在Class.hbm.xml,<class>中添加
-
1 <set name="students" cascade="save-update"> <!-- 对应的多对一映射, cascade: 级联(可以在测试类中不需要使用session.save(c);) --> 2 <key column="classId"></key> <!-- 对应的外键 --> 3 <one-to-many class="com.base.model.Student"/> <!-- 设置一对多的相对类 --> 4 </set>
-
- 在测试类中添加student 到set 中
-
1 public void testTestAdd() { 2 //简单添加示例 3 Class c = new Class(); 4 c.setName("2013级"); 5 //session.save(c); //因为使用了级联,可以不写save 6 7 Student s1 = new Student(); //创建一个学生 8 s1.setName("zhansan"); //设置名称 9 s1.setC(c); 10 //session.save(s1); //保存学生 11 12 Student s2 = new Student(); //创建一个学生 13 s2.setName("李四"); //设置名称 14 s2.setC(c); 15 //session.save(s2); //保存学生 16 17 c.getStudents().add(s1); 18 c.getStudents().add(s2); 19 20 session.save(c); 21 }
-
- 通过Class 打印学生
-
1 /** 2 * 通过Class 打印学生 3 */ 4 @Test 5 public void getStudentByClass(){ 6 Class c = (Class)session.get(Class.class, Integer.valueOf(1)); //取得Class对象 7 Set<Student> students = c.getStudents(); 8 for (Iterator iterator = students.iterator(); iterator.hasNext();) { 9 Student student = (Student) iterator.next(); 10 System.out.println(student); 11 12 } 13 }
-
- 一对多 双向自身关联关系映射
- 在model 中设置Node
- 定义四条属性
-
1 private int id; 2 private String name; 3 private Node parentNode; //父节点 4 private Set<Node> childNodes = new HashSet<Node>(); //设置子节点
- 在Node.hbm.xml
-
1 <class name="Node" table="t_node"> <!-- 类名与对应的数据表名 --> 2 <id name="id" column="nodeId"> <!-- 字段名,设置主键 --> 3 <generator class="native"/> 4 </id> 5 <property name="name" column="nodeName"/> <!--普通字段 --> 6 7 <many-to-one name="parentNode" column="parentId" class="com.base.model.Node" cascade="save-update"></many-to-one> 8 9 <set name="childNodes" inverse="true"> <!-- 对应的一对多映射 --> 10 <key column="parentId"></key> <!-- 对应的外键,与many-to-one的name对应 --> 11 <one-to-many class="com.base.model.Node"/> <!-- 设置一对多的相对类 --> 12 </set> 13 </class>
-
- 测试类中
-
1 @Test 2 public void TestAdd() { 3 4 Node node = new Node(); 5 node.setName("根节点"); 6 7 Node subNode1 = new Node(); 8 subNode1.setName("子节点1"); 9 10 Node subNode2 = new Node(); 11 subNode2.setName("子节点2"); 12 13 subNode1.setParentNode(node); 14 subNode2.setParentNode(node); 15 16 session.save(subNode1); 17 session.save(subNode2); 18 19 }
-