hibernate学习之第十二篇(续)

news/2025/2/8 22:14:02

《四》每个具体类映射一张独立的表(union-subclass),即表与子类之间的独立一对一关系
所有的子类的表中的信息都是完整的,不需要对表进行关联了。

person.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 package="hibernate.extend" auto-import="false">
    <class name="Person" table="person">
        <id name="id">
            <generator class="hilo"/>
        </id>
  
        <property name="name"/>
        <property name="age"/>
        <union-subclass name="Worker" table="worker">
            <property name="work_year"/>
        </union-subclass>
        <union-subclass name="Farmer" table="farmer">
            <property name="farm_name"/>
        </union-subclass>
    </class>
</hibernate-mapping>

 

产生的sql语句为:

写道
Hibernate: insert into person (name, age, id) values (?, ?, ?)
Hibernate: insert into worker (name, age, work_year, id) values (?, ?, ?, ?)
Hibernate: insert into farmer (name, age, farm_name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_.work_year as work1_9_0_, person0_.farm_name as farm1_10_0_, person0_.clazz_ as clazz_0_ from ( select null as work_year, id, age, name, null as farm_name, 0 as clazz_ from person union select work_year, id, age, name, null as farm_name, 1 as clazz_ from worker union select null as work_year, id, age, name, farm_name, 2 as clazz_ from farmer ) person0_ where person0_.id=?
 

执行后,数据库中表结构为:
person表:
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | person |   22 |
+----+--------+------+
worker表:
+----+--------+------+----------------+
| id  | name   | age  | work_year |
+----+--------+------+----------------+
|  2  | worker |   30 |        11        |
+----+--------+------+----------------+
farmer表:
+----+--------+------+--------------+
| id | name   | age  | farm_name|
+----+--------+------+--------------+
|  3 | farmer |   31 | little candy |
+----+--------+------+--------------+
注意:注意到我们把主键生成器改为使用高低键生成器了。因为native会根据使用的数据库自动选择相应的主键生成方式,由于我使用的是mysql数据库,对主键字段是自动增长的。也就是说在三个表中会有相同的主键id。这样在查询时就会出现问题。当你查一个id为1的person时,他会从三张表中都获得结果,这显然不行。所以这里改用高低键hilo生成方式,就不会出现这种问题。从上面的表中的数据也可以看出来。三个表的id是互不相同的。这种设计更符合实际需求。
补充:
同时,有时候父类是抽象类,这样就不需要在数据库中产生表了。这只需要加一个属性配置一下即可:
<?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 package="hibernate.extend" auto-import="false" abstract="true" >
    <class name="Person" table="person">
        <id name="id">
            <generator class="hilo" />
        </id>
  
        <property name="name"/>
        <property name="age"/>
        <union-subclass name="Worker" table="worker">
            <property name="work_year"/>
        </union-subclass>
        <union-subclass name="Farmer" table="farmer">
            <property name="farm_name"/>
        </union-subclass>

    </class>
</hibernate-mapping>


http://www.niftyadmin.cn/n/2864054.html

相关文章

MFS ——利用pacemaker+corosync+pcs实现mfsmaster的高可用

一.什么是mfsmaster的高可用 我们知道mfsmaster是调度器&#xff0c;是mfs最核心的地方&#xff0c;如果mfsmaster挂了&#xff0c;整个mfs架构会挂掉&#xff0c;对此我们要对mfsmaster进行高可用冗余操作。 MFS文件系统中&#xff0c;master负责各个数据存储服务器的管理&am…

hibernate学习之第十三篇

load方法的懒加载及原理分析 懒加载的目的&#xff0c;减少不必要的数据库查询&#xff0c;提升性能。 借用前面组件映射中的user类&#xff0c;对测试代码做写改变&#xff1a; public class Main {public static void main(String[] args) {User user new User();user.set…

hibernate学习之第十四篇

hibernate的内部缓存 hibernate的缓存分为两级&#xff1a;一级缓存&#xff08;session级)和二级缓存(sessionFactory级) 缓存的作用主要用来提高性能&#xff0c;可以简单的理解成一个Map&#xff1b;使用缓存涉及到三个操作&#xff1a;把数据放入缓存&#xff0c;从缓存中…

MFS——fence解决mfsmaster高可用中的脑裂问题

一、fence的工作原理 fence的工作原理&#xff1a; 当意外原因导致主机异常或者宕机时&#xff0c;备机会首先调用FENCE设备&#xff0c;然后通过FENCE设备将异常主机重启或者从网络隔离&#xff0c;当FENCE操作成功执行后&#xff0c;返回信息给备机&#xff0c;备机在接到FE…

Hibernate二级缓存攻略(转)

Hibernate二级缓存攻略(转)  很多人对二级缓存都不太了解&#xff0c;或者是有错误的认识&#xff0c;我一直想写一篇文章介绍一下hibernate的二级缓存的&#xff0c;今天终于忍不住了。   我的经验主要来自hibernate2.1版本&#xff0c;基本原理和3.0、3.1是一样的&#xf…

Log4J 基本使用方法

Log4J 基本使用方法 先看一个log4j.properies配置文件&#xff1a; #定义输出级别和输出平台 log4j.rootLoggerINFO,stdout,fileout #设定stdout输出平台 log4j.appender.stdoutorg.apache.log4j.ConsoleAppender log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout…

Ansible——自动化运维Ansible的部署以及常用模块的使用

一.Ansible的概念 当下有许多的运维自动化工具&#xff08;配置管理 &#xff09;&#xff0c;例如&#xff1a;Chef、Ansible、SaltStack、Puppet、Fabric 等。 Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台&#xff0c;是 AnsibleWorks 公司名下的…

hibernate学习之第十五篇

事务与事务边界 hibernate实际上使用jdbc实现事务管理&#xff0c;这种事务只能用于一个数据库。 tx session.beginTransaction();这句代码内部实际就是connection.setAutoCommit(false);的操作。Hibernate是JDBC的轻量级封装&#xff0c;本身并不具备事务管理能力。在事务管…