正在加载...
 
 登 录/注 册    帮助  |  反馈
相关主题:
    管 理  员:
    关 键  字:
    目 标 :[ 目标剩余时间: ]
    似乎已经突破了一种程序语言的界限,做的这么大而全,不知道到底是不是好事?
        
    作者
        简单Demo理解Hibernate中的关系映射   [2007-04-07]回复
    专家用户
    参与值:1128
    贡献值:23

    本例通过用户--》订单--》订单明细的实例来说明Hibernate中的关系映射,Hibernate中的关系和数据库中的关系没有什么关系。在Hibernate中使用config文件来配置映射关系,常见的关系有:one-to-one,many-to-one,set+one-to-many,set+many-to-many。

    我们需要3张表:

    drop table if exists my_user;
    create table my_user(
     user_id int primary key,
     user_name varchar(20)
    );

    drop table if exists my_order;
    create table my_order(
     order_id int primary key,
     user_id int,
     time timestamp
    );


    drop table if exists my_order_item;
    create table my_order_item(
     item_id int primary key,
     book_name varchar(20),
     book_num int,
     order_id int
    );

    先分析表与表的关系,用户对订单,属于一对多关系(set+one-to-many);订单对用户,属于多对一的关系(many-to-one);订单对订单明细,属于一对多关系(set+one-to-many);订单明细对订单,属于多对一关系(many-to-one)。

    配置ORM文件:

    在UserBean.hbm.xml中

    注意:关于lazy参数,在关系映射中,为了提高性能,一般把关联的对象设置为延迟加载;

    <set name="orders" table="my_order" lazy="true" inverse="false" cascade="all" sort="unsorted">

             <key column="user_id"/>

            <one-to-many class="beans.OrderBean"/>

    </set>

    在OrderBean.hbm.xml中

     

    <!-- 订单与用户:n:1 -->

            <many-to-one name="user" class="beans.UserBean"  column="user_id"/>

        <!-- 订单与订单明细:1:n -->

        <set name="items"

                table="my_order_item"

                lazy="true"

                inverse="false"

                cascade="all"

               sort="unsorted">

            <key column="order_id"/>

                  <one-to-many class="beans.OrderItemBean"/>

        </set>

    在OrderItemBean.hbm.xml中

     

    <many-to-one

               name="order"

               class="beans.OrderBean"

               column="order_id"

               />

     参数说明:

    1、inverse:控制方的设置,在映射1:n的关系中,应该one方设置inverse为“false",在many方把inverse设置为"true",可以提高应用性能;

                     在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性;

    2、cascade:级联方式的设置,有4个选项none/all/save-update/delete:
         none:是没有级联

         all:是所有的操作都级联

        save-update:是在进行save和update的时候级联

        delete:就是在delete的时候级联

    Demo.java

     

    public static void main(String[] args) {

          

           Session session=HibernateSessionFactory.getSession();

           Transaction ts=session.beginTransaction();

           //创建user

           UserBean user=new UserBean();

           user.setUser_name("Tom");

          

           //创建一个订单

           OrderBean order=new OrderBean();

           order.setTime(new java.sql.Timestamp(new java.util.Date().getTime()));

          

           //创建订单明细

           OrderItemBean items=new OrderItemBean();

           items.setBook_name("JAVA");

           items.setBook_num(new Integer(3));

          

           //订单明细2

           OrderItemBean items2=new OrderItemBean();

           items2.setBook_name("C++");

           items2.setBook_num(new Integer(6));

          

           //设置相互关系

           user.getOrders().add(order);

           order.getItems().add(items);

           order.getItems().add(items);

          

           //双向关系

           order.setUser(user);

           items.setOrder(order);

           items2.setOrder(order);

          

           //入库

           //由于用户和订单,订单和订单明细之间是级联关系,所以在添加用户时,把附属信息一并添加到数据库中

           session.save(user);

           ts.commit();

           session.close();

           System.out.println("数据已入库!");      

        }

    专家用户
    参与值:2212
    贡献值:112
     Johnbin  2007-04-07 评论  引用

    收藏了,简单的例子就让我清晰地了解Hibernate机制,Thank YOU!

      发表评论:

      ©2006-2008 深圳市海为信息技术有限公司  关于i170 | 工作机会 | 联系我们            粤ICP备05095695号