【问题标题】:hibernate simple inheritance - OR - xml property import/includehibernate 简单继承 - 或 - xml 属性导入/包含
【发布时间】:2012-07-01 09:19:26
【问题描述】:

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

非常简单的要求。不可能 (?) 使用 Hibernate!

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

map.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. 映射所有属性,同时从外部文件“导入”一些&lt;propert&gt; 项目,从而实现继承(属性的重用)。可能的?怎么办?!?

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

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

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

感谢上帝保佑!

【问题讨论】:

    标签: java xml hibernate orm hbmxml


    【解决方案1】:

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

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

    2。 Hibernate 对重用 XML 映射没有特别的支持,但它的文档建议在这种情况下使用 XML 实体,例如,请参阅 10.1.6. Table per concrete class using implicit polymorphism

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

    【讨论】:

    • 一直在研究注释选项,并在您编写它之前找到它。幸运的是,我距离从 Hibernate 中转出地狱还有几秒钟......无论如何 - 谢谢!
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2011-12-27
    • 2021-02-08
    相关资源
    最近更新 更多