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

一对多关系很常见,例如父亲和孩子、班级与学生的关系就是很好的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以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();
  
  
 }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值