Hibernate组件映射

Hibernate联合主键映射以及组件映射

 在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学生表,课程表,选课表)。第二种情况就是很常见的情况,即只有一张表,表的主键是由本身的两个字段或以上构成的。比如:公司的财务统计表,其中有字段年份、月份、销售金额。在这张表中年份和月份才唯一确定一条记录。下面就来说说联合主键第二种情况的配置,就以上面的财务统计表来说明。对于联合主键的这种情况,我们经常把表中的主键字段提取出来单独作为一个类,其他字段则作为另一个类。对于财务统计表来说,我们则把年份和月份作为一个类SalDate,在另一个类则包含引用这个类和其他的字段。

假设我们有两个类,SalDate类表示联合主键(year、month),Total类(private int salTotal;private SalDate sd;)建完这两个类之后我们开始写Total.hbm.xml的配置文件:

 

<hibernate-mapping package="com.fendou.hibernate">  
    <class name="Total" table="t_salTotal">  
        <composite-id name="sd">  
            <key-property name="year"/>  
            <key-property name="month"/>  
        </composite-id>  
        <property name="salTotal" length="50" column="sTotal"/>  
          
    </class>  
</hibernate-mapping>  

运行下,出现下面结果:

create table t_salTotal (year integer not null, month integer not null, sTotal integer, primary key (year, month))

没有问题。下面我们插入几条数据测试下:

session = HibernateUtils.getSession();  
            //开启事务  
            tr = session.beginTransaction();  
            SalDate d1 = new SalDate();  
            d1.setMonth(12);  
            d1.setYear(2010);  
              
            SalDate d2 = new SalDate();  
            d2.setMonth(12);  
            d2.setYear(2010);  
              
            Total t1 = new Total();  
            t1.setSalTotal(10000);  
            t1.setSd(d1);  
              
            Total t2 = new Total();  
            t2.setSalTotal(30000);  
            t2.setSd(d2);  
            session.save(t1);  
            session.save(t2);  
            tr.commit();  

运行下:结果报错了:20:55:57,078  WARN RootClass:215 - composite-id class does not override hashCode(): com.fendou.hibernate.SalDate

组件映射:组件映射相对比较简单,所谓的组件就是一个被包含的对象。比如我们可以将通讯方式设置为一个组件,这个组件里面包含(QQ,MSN,Email,住址),而其他的对象皆可以使用这个组件,比如Teacher对象、Student对象。

组件对象代码如下:

package com.fendou.hibernate;  
public class Component {  
    private String name;  
    private String tel;  
    private String address;  
    private String email;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getTel() {  
        return tel;  
    }  
    public void setTel(String tel) {  
        this.tel = tel;  
    }  
      
    public String getAddress() {  
        return address;  
    }  
    public void setAddress(String address) {  
        this.address = address;  
    }  
    public String getEmail() {  
        return email;  
    }  
    public void setEmail(String email) {  
        this.email = email;  
    }  
      
      
      
}  

使用组件的Teacher对象如下:

 

package com.fendou.hibernate;  
public class Teacher {  
    private int id;  
    private int sal;  
    public Component getComp() {  
        return comp;  
    }  
    public void setComp(Component comp) {  
        this.comp = comp;  
    }  
    private Component comp;  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public int getSal() {  
        return sal;  
    }  
    public void setSal(int sal) {  
        this.sal = sal;  
    }  
      
}  

配置文件如下:

<hibernate-mapping package="com.fendou.hibernate">  
    <class name="Teacher" table="t_teacher">  
        <id name="id" column="tid" length="2">  
            <generator class="native"></generator>  
        </id>  
        <property name="sal" />  
        <component name="comp">  
            <property name="name"/>  
            <property name="tel"/>  
            <property name="email"/>  
            <property name="address"/>  
        </component>  
    </class>  
</hibernate-mapping>  

 

 

 

 

 

 

 

 

posted @ 2016-09-05 16:47  Onlyだ  阅读(141)  评论(0编辑  收藏  举报