您的位置:首页 > 其它

hibernate 关联关系 一对多 单向关联 .

2014-09-18 16:35 218 查看
一对多关系很常见,例如父亲和孩子、班级与学生的关系就是很好的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以Group(班级)和Student(学生)为例讲解如何配置一对多的关系。

单向的一对多关系只需在一方进行映射配置,所以我们只配置Group(班级)的映射文件Group.hbm.xml

group 表结构:

create table "CLASSICCARS"."GROUPS"(

"ID" BIGINT not null,

"NAME" VARCHAR(20),

constraint "SQL140918025642540" primary key ("ID")

);

group pojo:

public class Groups {

private Long id;

private String name;

private Set student1;

}

Group.hbm.xml:

<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Groups" table="GROUPS" schema="CLASSICCARS" lazy="true">
<id name="id" type="java.lang.Long" >
<column name="ID" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String" >
<column name="NAME" length="20" not-null="true"/>
</property>

<set name="student1" table="student1" lazy="false" inverse="false" cascade="all" sort="unsorted">
<key column="group_id" not-null="true"></key>
<one-to-many class="hibernateTest.Student1"/>
</set>

</class>
</hibernate-mapping>


<set>元素描述的字段对应的类型为java.util.Set,它的各个属性的含义如下:

1.name 字段名,本例的字段名为student1,它属于java.util.Set类型

2.table 关联表名,本例中student1的关联数据表名是student1.

3.lazy 是否延迟加载,lazy=false表示立即加载。

4.inverse:用于表示双向关联中的被动方的一端,inverse的值为false的一方负责维护关联关系。默认为false。本例的group将负责维护它与student之间的关联关系。

5.cascase 级联关系,cascade=all 表示所有情况下均进行级联操作,即包含save-update和delete操作。

6.sort 排序关系,其可选取的值为unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了java.util.comparator接口的类型指定排序算法)。

<key>子元素的column属性指定关联表(本例中student表)的外键,<one-to-many>子元素的class属性指定了关联类的名字。

<p>Student1表结构:</p><p>      create table "CLASSICCARS"."STUDENT1"(
        "ID" BIGINT not null,
       "NAME" VARCHAR(20),
       "group_id" BIGINT,
       "SEX" VARCHAR(5),
       "AGE" BIGINT,
        constraint "SQL140913082545570" primary key ("ID")
    );group pojo:</p><p>
public class Student1{</p><p> </p><p> private Long id;
 private String name;</p><p> private String sex;
 private Long age;
 private Long group_id; </p><p>}</p><p>Student1.hbm.xml:</p><p><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"<a target=_blank href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="hibernateTest.Student1" table="STUDENT1" schema="CLASSICCARS" lazy="false">
        <id name="id" type="java.lang.Long">
            <column name="ID" not-null="true"/>
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="20" />
        </property>
     
        <property name="sex" type="java.lang.String">
            <column name="SEX" length="5" />
        </property>
        <property name="age" type="java.lang.Long">
            <column name="AGE" />
        </property>
      
           </class>
</hibernate-mapping>
</p><p> </p>

注意:字段group_id不用在student 映射文件配置,因为在group那里以经有说明,否则会报重复错误。

public static void main(String[] args) {

// TODO Auto-generated method stub

Session session=HibernateSessionFactory.getSession();

Transaction tx=session.beginTransaction();

Student1 stu=new Student1();

Groups groups=(Groups) session.get(Groups.class, (long)3);

stu.setName("Linli");

stu.setSex("Femal");

stu.setAge((long)25);

session.save(groups);

tx.commit();

session.close();

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