1

最终目标:
让一些共享相同基类的 java 对象持久化到数据库中,而每个对象都有自己的自包含表,其中包含所有自己/继承的对象,以及由数据库 id 自动生成的简单对象

很简单的要求。不可能(?)与休眠!

到目前为止我所拥有的(使用 MySQL,Hibernate XML 映射):

地图.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field"
    default-lazy="false">

    <class name="xyz.url.hibernate.EntityBase" abstract="true">
        <id name="m_id" column="id">
            <generator class="identity" />
        </id>

        <version name="m_version" column="version" type="long" />

        <union-subclass name="xyz.url.hibernate.User" table="my_entity">
            <property name="name" column="name" type="string" />
        </union-subclass>
    </class>

</hibernate-mapping>

EntityBase.java

public abstract class EntityBase {
    private final long  m_id;
    private final long  m_version;

    public EntityBase() {
        this.m_id = 0;
        this.m_version = 0;
    }

    public long get_id() {
        return this.m_id;
    }

    public long get_version() {
        return this.m_version;
    }
}

用户.java

public class User extends EntityBase {
    public String   name;
}

除非您将generator类更改为increment.
目前这是给定的错误:

org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: xyz.url.hibernate.User

好吧,为什么 Hibernate 假设我想要一个程序范围内的唯一 ID(我已经阅读了一些 JPA 要求)......真是个废话!

无论如何,我坚持有一个简单的表(每个对象)来聚合所有对象的(User在这种情况下)属性,并拒绝使用只会使最终 SQL 查询复杂化并影响性能的鉴别器(又是什么废话……)。

我在这里看到的唯一解决方案:

  1. 在 XML 内的一个块中手动映射所有属性。

  2. <propert>映射所有属性,同时从外部文件“导入”一些项目,从而实现继承(属性的重用)。可能的?怎么做?!?

  3. 进一步探索注释,据我所知,它们不支持简单的继承要求。

  4. 转储 Hibernate 并使用另一个 ORM 解决方案。

请不要链接到文档 - 在阅读了几次之后我放弃了那个文档!
一个属性导入的例子(从外部文件)会很棒。

感谢上帝保佑!

4

2 回答 2

1

首先,您需要决定您的继承关系是否应该映射到数据库(以允许多态查询,例如from EntityBase,多态关系等)。

据我了解,在您的情况下,它不应该被映射,因此使用继承映射选项根本没有意义<union-subclass>。现在您有以下选择:

2. Hibernate 没有特别支持重用 XML 映射,但它的文档建议在这种情况下使用 XML 实体,例如,参见10.1.6。使用隐式多态性的每个具体类的表

@MappedSuperclass3.注解当然以注解的形式支持这个要求。这个注解可以用来标记一个没有映射到数据库本身的类,但是在它的属性上定义的任何映射注解都会对其映射的子类生效,所以你不需要重复。

于 2012-07-01T14:08:56.733 回答
0

您还可以使用 XML 实体参考,请参阅:

https://n1njahacks.wordpress.com/2014/09/19/hibernate-xml-mapping-fragment-re-use/ http://xml.silmaril.ie/includes.html

于 2015-05-31T18:48:51.270 回答