Hibernate 专题
专题目录
您的位置:java > Hibernate 专题 > Hibernate每个具体类一张表映射(使用XML)
Hibernate每个具体类一张表映射(使用XML)
作者:--    发布时间:2019-11-20

在每个具体类一个表中,数据库中将有三个表但彼此之间没有关系(关联)。 根据具体类策略将表格映射到表有两种方法。

  • union-subclass元素指定
  • 通过自我为每个类创建表

我们来了解映射的层次结构。

下面来看看看我们如何通过union-subclass元素映射这个层次结构, employee.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">
<!--// by http://www.h3.com/hibernate -->
<hibernate-mapping>
    <class name="com.h3.employee" table="emp122">
        <id name="id">
            <generator class="increment"></generator>
        </id>

        <property name="name"></property>

        <union-subclass name="com.h3.regular_employee"
            table="regemp122">
            <property name="salary"></property>
            <property name="bonus"></property>
        </union-subclass>

        <union-subclass name="com.h3.contract_employee"
            table="contemp122">
            <property name="pay_per_hour"></property>
            <property name="contract_duration"></property>
        </union-subclass>

    </class>

</hibernate-mapping>

在每个具体类一张表的情况下,数据库中将有三个表,每个表表示一个特定的类。
类的union-subclass子元素指定子类。 它将父表的列添加到此表中。换句话说,将它们作为一个联合。

每个表的格结构如下:
employee类的表结构 -

create table `emp122` (
  `id` int(11) not null,
  `name` varchar(255) default null,
  primary key (`id`)
) engine=innodb default charset=utf8;

regular_employee类的表结构 -

create table `regemp122` (
  `id` int(11) not null,
  `name` varchar(255) default null,
  `salary` float default null,
  `bonus` int(11) default null,
  primary key (`id`)
) engine=innodb default charset=utf8;

contract_employee类的表结构 -

create table `contemp122` (
  `id` int(11) not null,
  `name` varchar(255) default null,
  `pay_per_hour` float default null,
  `contract_duration` varchar(255) default null,
  primary key (`id`)
) engine=innodb default charset=utf8;

每个具体类的表示例

在这个例子中,我们创建了三个类,并在employee.hbm.xml文件中提供了这些类的映射。创建一个项目:inheritance2, 完整的项目结构如下 -

1)创建持久类

您需要创建表示继承的持久化类。 让我们为上面的层次结构创建三个类:

文件:employee.java

package com.h3;

public class employee {
    private int id;
    private string name;

    public int getid() {
        return id;
    }

    public void setid(int id) {
        this.id = id;
    }

    public string getname() {
        return name;
    }

    public void setname(string name) {
        this.name = name;
    }

}

文件:regular_employee.java

package com.h3;
/**
 * 
 * @author by maxsu
 * @copyright http://www.h3.com
 * @link download at: http://www.h3.com/siteinfo/download.html
 */
public class regular_employee extends employee {
    private float salary;
    private int bonus;

    public float getsalary() {
        return salary;
    }

    public void setsalary(float salary) {
        this.salary = salary;
    }

    public int getbonus() {
        return bonus;
    }

    public void setbonus(int bonus) {
        this.bonus = bonus;
    }

}

文件:contract_employee.java

package com.h3;
/**
 * 
 * @author by maxsu
 * @copyright http://www.h3.com
 * @link download at: http://www.h3.com/siteinfo/download.html
 */
public class contract_employee extends employee {
    private float pay_per_hour;
    private string contract_duration;

    public float getpay_per_hour() {
        return pay_per_hour;
    }

    public void setpay_per_hour(float payperhour) {
        pay_per_hour = payperhour;
    }

    public string getcontract_duration() {
        return contract_duration;
    }

    public void setcontract_duration(string contractduration) {
        contract_duration = contractduration;
    }

}

2)创建持久类的映射文件

上面已经了解了层次结构,接下来看看映射配置。

文件:employee.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">

<hibernate-mapping>
    <class name="com.h3.employee" table="emp122">
        <id name="id">
            <generator class="increment"></generator>
        </id>

        <property name="name"></property>

        <union-subclass name="com.h3.regular_employee"
            table="regemp122">
            <property name="salary"></property>
            <property name="bonus"></property>
        </union-subclass>

        <union-subclass name="com.h3.contract_employee"
            table="contemp122">
            <property name="pay_per_hour"></property>
            <property name="contract_duration"></property>
        </union-subclass>

    </class>

</hibernate-mapping>

3)在配置文件中添加hbm文件的映射

打开hibernate.cfg.xml文件,并添加如下映射资源的项:

<mapping resource="employee.hbm.xml"/>

现在配置文件将如下所示:

文件:hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!doctype hibernate-configuration public
          "-//hibernate/hibernate configuration dtd 3.0//en"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- generated by myeclipse hibernate tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.driver_class">com.mysql.jdbc.driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="dialect">org.hibernate.dialect.mysql5innodbdialect</property>
        <property name="show_sql">true</property>
         <mapping resource="employee.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

hbm2ddl.auto属性定义是用于在数据库中创建自动表。

4)创建存储持久对象的类

在这个类中,我们只是将employee 对象存储在数据库表中。

文件:maintest.java

package com.h3;

import org.hibernate.*;
import org.hibernate.boot.metadatasources;
import org.hibernate.boot.registry.standardserviceregistry;
import org.hibernate.boot.registry.standardserviceregistrybuilder;

/**
 * 
 * @author by maxsu
 * @copyright http://www.h3.com
 * @link download at: http://www.h3.com/siteinfo/download.html
 */

public class maintest {
    public static void main(string[] args) {
        // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
        // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
        // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
        final standardserviceregistry registry = new standardserviceregistrybuilder()
                .configure("hibernate.cfg.xml").build();
        // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
        sessionfactory sessionfactory = new metadatasources(registry)
                .buildmetadata().buildsessionfactory();

        /**** 上面是配置准备,下面开始我们的数据库操作 ******/
        session session = sessionfactory.opensession();// 从会话工厂获取一个session

        // creating transaction object
        transaction t = session.begintransaction();

        employee e1 = new employee();
        e1.setname("用户名-01");

        regular_employee e2 = new regular_employee();
        e2.setname("h3 su");
        e2.setsalary(50002);
        e2.setbonus(5);

        contract_employee e3 = new contract_employee();
        e3.setname("mina su");
        e3.setpay_per_hour(1010);
        e3.setcontract_duration("15 hours");

        session.persist(e1);
        session.persist(e2);
        session.persist(e3);

        t.commit();
        session.close();
        system.out.println("success");
    }
}

执行上面代码运行测试即可,应该会自动创建三张表,并插入数据。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册