jpa 将Hibernate混合继承从hbm.xml迁移到orm.xml

9w11ddsr  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(203)

考虑以下Java层次结构:

我希望将整个层次结构存储在一个名为file的表中,但SpecialOutFile除外,它应该有专用的special_file表。
使用hbm.xmlMap可以很好地工作:

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping"
                   default-access="field"
                   default-cascade="all"
                   default-lazy="true">

    <class name="com.example.demo.File">
        <id name="id"/>
        <discriminator column="file_type"/>

        <subclass name="com.example.demo.InFile" discriminator-value="InFile"/>
        <subclass name="com.example.demo.TypedOutFile1" discriminator-value="TypedOutFile1"/>
        <subclass name="com.example.demo.TypedOutFile2" discriminator-value="TypedOutFile2"/>
        <subclass name="com.example.demo.OutFile" discriminator-value="OutFile"/>
    </class>

    <class name="com.example.demo.SpecialOutFile" table="special_file">
        <id name="id"/>
        <property name="moreData"/>
    </class>
</hibernate-mapping>

当我持久化一个OutFile时,只在file中插入了一条记录。
当我持久化一个SpecialOutFile时,只在special_file中插入了一条记录。
现在我想在orm.xml中做同样的事情,因为hbm.xml在Hibernate 6中已经过时了。但是,我无法重现完全相同的行为。
我能得到的最接近的方法是使用一个辅助表,但是现在当我持久化一个SpecialOutFile时,会创建两条记录:一个在file中,一个在special_file中:

Hibernate: insert into file (some_data, type, id) values (?, 'SpecialOutFile', ?)
Hibernate: insert into special_file (more_data, id) values (?, ?)

下面是我的orm.xml的当前版本:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0"
                 xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

    <access>FIELD</access>

    <entity class="com.example.demo.File">
        <discriminator-column name="type"/>
        <attributes>
            <id name="id"/>
        </attributes>
    </entity>

    <entity class="com.example.demo.InFile">
        <discriminator-value>InFile</discriminator-value>
    </entity>
    <entity class="com.example.demo.TypedOutFile1">
        <discriminator-value>TypedOutFile1</discriminator-value>
    </entity>
    <entity class="com.example.demo.TypedOutFile2">
        <discriminator-value>TypedOutFile2</discriminator-value>
    </entity>
    <entity class="com.example.demo.OutFile">
        <discriminator-value>OutFile</discriminator-value>
    </entity>

    <entity class="com.example.demo.SpecialOutFile">
        <secondary-table name="special_file"/>
        <attribute-override name="id">
            <column table="special_file"/>
        </attribute-override>
        <attributes>
            <basic name="moreData">
                <column table="special_file"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings>

在持久化SpecialOutFile时,是否有一种方法可以将所有继承的属性移动到辅助表中,并完全摆脱主表,就像我对hbm.xmlMap所做的那样?
此处为最小可重现示例:https://github.com/bjansen/so-question-75328749

vmdwslir

vmdwslir1#

我认为您正在寻找的是基于鉴别器的连接继承:https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_joined_inheritance_XML
除了SpecialOutFile之外,您只需为每个类指定相同的表名。

相关问题