• 组件映射


    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>  
  • 相关阅读:
    JDK5的新特性
    反射(一)类加载器、反射、动态代理
    泛型(五)
    spring自定义注解实现登陆拦截器
    java国际化
    Codeforces 231A
    Codeforces 231A
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-1 小明种苹果
  • 原文地址:https://www.cnblogs.com/Smile-123/p/5842823.html
Copyright © 2020-2023  润新知