gpt4 book ai didi

java - hibernate简单继承 - 或 - xml属性导入/包含

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:38 25 4
gpt4 key购买 nike

最终目标:
有一些共享相同基类的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,否则上述内容不起作用。类(class) 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 内一个 block 中的所有属性。

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

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

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

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

感谢上帝保佑!

最佳答案

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

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

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

3.注释当然以 @MappedSuperclass annotation 的形式支持这一要求。 。该注解可用于标记未映射到数据库本身的类,但在其属性上定义的任何映射注解都会对其映射的子类生效,因此您无需重复它们。

关于java - hibernate简单继承 - 或 - xml属性导入/包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com