hibernate学习之第十二篇

news/2025/2/23 6:40:03

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

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" discriminator-value="0">
        <id name="id">
            <generator class="native"/>
        </id>
      
        <discriminator column="type" type="int"/>  
       
        <property name="name"/>
        <property name="age"/>
      
        <subclass name="Worker" discriminator-value="1">
            <property name="work_year"/>
        </subclass>

        <subclass name="Farmer" discriminator-value="2">  //鉴别器的默认值是类的名称,字符串类型
            <join table="farmer">
                <key column="person_id"/>
                <property name="farm_name"/>
            </join>
        </subclass>

    </class>
</hibernate-mapping>

执行以上代码,可能会出现问题,跟hibernate配置有关。我们在前面配置了:
  <property name="hibernate.hbm2ddl.auto">create</property>
在每次启动应用的时候,会先到数据库中删除相应的表。首先删除farmer表,它可以正确删除,然后根据配置文件(配置文件中表明只有这两张表)又要去删除person表。在我们前面写每个子类对应一张表时,生成了三张表,他们当时还在数据库中(名字前后一样)。也即是说第一次运行时,删的farmer表其实是上面产生的farmer表。由于根据要求要去删除person表,这时就会报错。因为worker表尚未删除,先删除person表,会引起外键关联错误。
所以可以手动把相关表删掉,再运行就可以通过了。
产生的sql语句如下:

Hibernate: insert into person (name, age, type) values (?, ?, 0)
Hibernate: insert into person (name, age, work_year, type) values (?, ?, ?, 1)
Hibernate: insert into person (name, age, type) values (?, ?, 2)
Hibernate: insert into farmer (farm_name, person_id) values (?, ?)
 


数据库中的表结构为:

person表:
+----+------+--------+------+---------------+
| id | type | name   | age  | work_year |
+----+------+--------+------+---------------+
|  1  |    0  | person |   22 |      NULL      |
|  2  |    1  | worker |   30 |       11         |
|  3  |    2  | farmer  |   31 |      NULL      |
+----+------+--------+------+-----------+
farmer表:
+-----------+------------------+
| person_id | farm_name    |
+-----------+-------------------+
|         3 | little candy          |
+-----------+-------------------+


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

相关文章

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…

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…