您的位置:首页 > 其它

Hibernate: 关联关系一对多映射

2014-11-22 07:40 363 查看
gitHub

一对多单向映射  (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>  //多对一


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.base.model">

<class name="Student" table="t_student">    <!-- 类名与对应的数据表名 -->
<id name="id" column="stuId">            <!-- 字段名,设置主键 -->
<generator class="native"/>
</id>
<property name="name"/>            <!--普通字段  -->

<many-to-one name="c" column="classId" class="com.base.model.Class"></many-to-one>  //多对一
</class>

</hibernate-mapping>


设置Class.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.base.model">

<class name="Class" table="t_class">    <!-- 类名与对应的数据表名 -->
<id name="id" column="classId">            <!-- 字段名,设置主键 -->
<generator class="native"/>
</id>
<property name="name" column="className"/>            <!--普通字段  -->
</class>

</hibernate-mapping>


添加Hibernate.cfg.xml

在<session-factory>标签里添加

<mapping resource="com/base/model/Student.hbm.xml"/>    <!-- xml版使用resource -->
<mapping resource="com/base/model/Class.hbm.xml"/>    <!-- xml版使用resource -->


设置测试类

public class StudentCalssTest2Test {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();    //由于每个步骤都会用到所以移到外面来
Session session;
@Before
public void setUp() throws Exception {
session = sessionFactory.openSession();    //生成一个新的session
session.beginTransaction();    //开启事物
}

@After
public void tearDown() throws Exception {
session.getTransaction().commit();    //提交事务
session.close();                    //关闭session
}

@Test
public void testTestAdd() {
//简单添加示例
Class c = new Class();
c.setName("2013级");
session.save(c);

Student s1 = new Student();        //创建一个学生
s1.setName("zhansan");            //设置名称
s1.setC(c);
session.save(s1);                //保存学生

Student s2 = new Student();        //创建一个学生
s2.setName("李四");            //设置名称
s2.setC(c);
session.save(s2);                //保存学生
}
  }


一对多双向映射 (Class 获取Student )

使用set集合在Class 类中添加Student 属性

private Set<Student> students = new HashSet<Student>();    //班级对应的学生


添加get set

在Class.hbm.xml,<class>中添加

<set name="students" cascade="save-update">        <!-- 对应的多对一映射, cascade: 级联(可以在测试类中不需要使用session.save(c);) -->
<key column="classId"></key>    <!-- 对应的外键 -->
<one-to-many class="com.base.model.Student"/>    <!-- 设置一对多的相对类 -->
</set>


在测试类中添加student 到set 中

public void testTestAdd() {
//简单添加示例
Class c = new Class();
c.setName("2013级");
//session.save(c);                //因为使用了级联,可以不写save

Student s1 = new Student();        //创建一个学生
s1.setName("zhansan");            //设置名称
s1.setC(c);
//session.save(s1);                //保存学生

Student s2 = new Student();        //创建一个学生
s2.setName("李四");            //设置名称
s2.setC(c);
//session.save(s2);                //保存学生

c.getStudents().add(s1);
c.getStudents().add(s2);

session.save(c);
}


通过Class 打印学生

/**
* 通过Class 打印学生
*/
@Test
public void getStudentByClass(){
Class c = (Class)session.get(Class.class, Integer.valueOf(1));    //取得Class对象
Set<Student> students = c.getStudents();
for (Iterator iterator = students.iterator(); iterator.hasNext();) {
Student student = (Student) iterator.next();
System.out.println(student);

}
}


一对多 双向自身关联关系映射

在model 中设置Node
  定义四条属性

private int id;
private String name;
private Node parentNode;    //父节点
private Set<Node> childNodes = new HashSet<Node>();    //设置子节点


在Node.hbm.xml

<class name="Node" table="t_node">    <!-- 类名与对应的数据表名 -->
<id name="id" column="nodeId">            <!-- 字段名,设置主键 -->
<generator class="native"/>
</id>
<property name="name" column="nodeName"/>            <!--普通字段  -->

<many-to-one name="parentNode" column="parentId" class="com.base.model.Node" cascade="save-update"></many-to-one>

<set name="childNodes"  inverse="true">                <!-- 对应的一对多映射 -->
<key column="parentId"></key>    <!-- 对应的外键,与many-to-one的name对应 -->
<one-to-many class="com.base.model.Node"/>    <!-- 设置一对多的相对类 -->
</set>
</class>


测试类中

  

@Test
public void TestAdd() {

Node node = new Node();
node.setName("根节点");

Node subNode1 = new Node();
subNode1.setName("子节点1");

Node subNode2 = new Node();
subNode2.setName("子节点2");

subNode1.setParentNode(node);
subNode2.setParentNode(node);

session.save(subNode1);
session.save(subNode2);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: