hibernate学习之第十一篇(2)

news/2024/6/29 12:02:08

《二》每个子类映射到一张表(joined-subclass)
配置文件修改为:

<?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="native"/>
        </id>

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

        <joined-subclass name="Worker" table="worker" >
            <key column="person_id"></key> //指定外键关联的列
            <property name="work_year"/>
        </joined-subclass>
        <joined-subclass name="Farmer" table="farmer" >
            <key column="person_id"/>    //指定外键关联的列
            <property name="farm_name"/>
        </joined-subclass>
    </class>
</hibernate-mapping>

上面的配置中,我们并没有单独为worker和farmer编写映射文件,而是通过joined-subclass节点在父类映射文件中对子类进行了配置。


仍然执行上面的测试代码,查看输出的sql语句为:

写道
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into worker (work_year, person_id) values (?, ?)
Hibernate: insert into person (name, age) values (?, ?)
Hibernate: insert into farmer (farm_name, person_id) values (?, ?)
 

这时数据库中就有三张表了,分别为:person表,worker表,farmer表。结构如下:
person:                      
+----+--------+------+     
| id | name   | age  |   
+----+--------+------+
|  1 | person |   22 |
|  2 | worker |   30 |
|  3 | farmer |   31 |
+----+--------+------+
 worker:
+-----------+----------------+
| person_id | work_year |
+-----------+----------------+
|         2    |        11         |
+-----------+----------------+

farmer:
+-----------+-----------------+
| person_id | farm_name |
+-----------+-----------------+
|         3     | little candy    |
+-----------+-----------------+

查询:

static void query(int id) {
        Session s = HibernateUtil.getSession();
        Transaction tx = s.beginTransaction();
        Worker worker = (Worker) s.get(Worker.class, id);
        tx.commit();
        System.out.println("year: "+worker.getWork_year());
    }
 

调用query(2);
打印输出的sql语句为:

Hibernate: select worker0_.person_id as id8_0_, worker0_1_.name as name8_0_, worker0_1_.age as age8_0_, worker0_.work_year as work2_9_0_ from worker worker0_ inner join person worker0_1_ on worker0_.person_id=worker0_1_.id where worker0_.person_id=?
year: 11
 



如果把着色部分修改为:Worker worker = (Worker) s.get(Person.class , id);
打印输出的sql语句为:

Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_1_.work_year as work2_9_0_, person0_2_.farm_name as farm2_10_0_, case when person0_1_.person_id is not null then 1 when person0_2_.person_id is not null then 2 when person0_.id is not null then 0 end as clazz_0_ from person person0_ left outer join worker person0_1_ on person0_.id=person0_1_.person_id left outer join farmer person0_2_ on person0_.id=person0_2_.person_id where person0_.id=?
year: 11
 


 由此可见:hibernate支持多态查询。在查询语句中,指定父类类型,hibernate会关联三张表到其中去查,而指定了具体的类型,则只会查找相关的表。如果子类有很多,那么最好明确指定查的子类,否则,对多表关联查询,会带来性能问题。


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

相关文章

MFS——分布式文件系统的安装与部署

一.什么是MFS MFS简介 分布式文件系统是指文件系统管理的物理存储资源通过计算机网络与各节点相连。简单讲&#xff0c;就是把一些分散的共享文件夹&#xff0c;集合到一个文件夹内。对于用户来说&#xff0c;只需要打开该虚拟文件夹&#xff0c;就可以使用这些分散的文件夹进…

hibernate学习之第十二篇

《三》混合使用“一个类继承体系一张表”和“每个子类一张表” 比如上面的例子&#xff0c;worker类可能属性很少&#xff0c;而farmer属性却很多&#xff0c;把两者都与person放在同一张表中&#xff0c;则显得表的 结构不是很合理&#xff0c;会有很多字段是null。所以我们可…

MFS——如何恢复挂掉的mfsmaster服务

需要了解的知识&#xff1a; 在正常关闭的时候&#xff0c;/var/lib/mfs目录中会产生metadata.mfs这个文件&#xff0c;这个文件是开启mfsmaster服务时必备的文件。如果没有该文件,那么mfsmaster服务也就起不来。在正常开启的时候&#xff0c;/var/lib/mfs目录中就会产生metad…

hibernate学习之第十二篇(续)

《四》每个具体类映射一张独立的表&#xff08;union-subclass&#xff09;&#xff0c;即表与子类之间的独立一对一关系 所有的子类的表中的信息都是完整的&#xff0c;不需要对表进行关联了。 person.hbm.xml的配置如下&#xff1a; <?xml version"1.0" enco…

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…