注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

赚客吧

 
 
 

日志

 
 
关于我

从明天起,做一个幸福的人, 洗澡,撸管,好好工作, 从明天起,关心姑娘和票子, 我有一种追求,骚气蓬勃,春心荡漾。

网易考拉推荐

Hibernate组件映射  

2010-11-26 16:23:56|  分类: Hibernate |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先了解一下什么是组件。组件是一个被包含的对象,它和它的所有者同存于一张表中,也就是说它仅仅是个值类型,而不是一个实体。值类型和实体的区别在于值类型没有标识符,当然了持久化一个值类型也就不需要标识符属性。下面我们来看一个具体的例子。

      用到的POJO代码如下:

public class Member {
    private String id;
    private String name;
    private Integer age;
    private Address homeAddress;
    private Address billingAddress;

......


}

public class Address {

    private String street;
    private String zipCode;
    private String city;

......


}

对于Member来说,Address是它的一个组件。下面是对应的映射文件。

<hibernate-mapping package="org.louis.domain">
    <class name="Member" table="TEST_MEMBER">
        <id name="id" column="ID">
            <generator class="uuid.hex"></generator>
        </id>
        <property name="age" column="AGE"></property>
        <property name="name" column="NAME"></property>
       
        <component name="homeAddress" class="Address">
            <property name="street" column="home_street"></property>
            <property name="zipCode" column="home_zip_code"></property>
            <property name="city" column="home_city"></property>
        </component>
       
        <component name="billingAddress" class="Address">
            <property name="street" column="billing_street"></property>
            <property name="zipCode" column="billing_zip_code"></property>
            <property name="city" column="billing_city"></property>
        </component>
    </class>
</hibernate-mapping>

 

       在上面的Member.hbm.xml文件中,Address作为Member的组件被定义,共使用了两次,分别对应于Member的两个属性。根据配置文件知道,Member可以获得它的组件,儿Address却不能得到它的所有者,如果也想让Address得到它的所有者,可以在<component>中添加一个节点<parent name="Member",同时在Address的类中增加member属性,并提供getter和setter方法即可使用如address.getMember()来操作Member类。

运行测试代码:

    public void insert() {
        Session session = HibernateSessionFactory.getSessionFactory()
                .getCurrentSession();
        session.beginTransaction();
        Member m = new Member();
        m.setAge(24);
        m.setName("Louis");

        Address homeAddress = new Address();
        homeAddress.setCity("南阳");
        homeAddress.setStreet("nanyang");
        homeAddress.setZipCode("nanyang");

        Address billingAddress = new Address();
        billingAddress.setCity("上海");
        billingAddress.setStreet("shanghai");
        billingAddress.setZipCode("shanghai");

        m.setHomeAddress(homeAddress);
        m.setBillingAddress(billingAddress);

        session.save(m);

        session.getTransaction().commit();
    }

后台SQL语句如:

Hibernate:
    insert
    into
        TEST_MEMBER
        (AGE, NAME, home_street, home_zip_code, home_city, billing_street, billing_zip_code, billing_city, ID)
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)

由此可见,Hibernate会把TEST_MEMBER表的字段进行解析,把对应的值设置到homeAddress和billingAddress对象中。

  评论这张
 
阅读(1507)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017