gpt4 book ai didi

java - Hibernate,映射继承字段

转载 作者:行者123 更新时间:2023-11-30 07:12:31 24 4
gpt4 key购买 nike

假设我有以下类层次结构:

class Person {
String name;
int age;
}
class DatabasePerson extends Person {
int databaseId;
}

现在我想映射 DatabasePerson,请注意我不想告诉 hibernate 存在一个 Person 类,hibernate 在 xml 或注释映射时应该只知道 DatabasePerson 类。是否可以采用上述条件将年龄和姓名字段映射到 hibernate 状态?换句话说,我想将 DatabasePerson 类映射到 hibernate 状态,而 hibernate 状态不应该知道 Person 类。在 xml 中,我会像这样(伪代码):

<hibernate class="DatabasePerson">
<field name="id"/>
<field name="name"/>
<field name="age"/>
</hibernate>

这样做的原因是为了保持单一职责原则。我不想将 databaseId 字段放入 Person 类中,因为 person 类不应该知道它是持久化的。我不想在 Person 类中包含任何 hibernate 注释,因为我有纯实体逻辑,我不想在那里导入任何与数据库相关的东西,比如 hibernate 。我想在 DatabasePerson 类中做的所有映射,这是我想放置额外的 databaseId 字段的地方,写 hibernate 注释(或者可能是 xml,我现在不知道,我想推迟这个决定)。换句话说,我们希望将数据库相关的东西和我们的应用程序逻辑放在不同的类中。

编辑:我可以使用这样的东西吗?:

<class name="Person" table="PERSON" discriminator-value="P">


<discriminator column="DISCRIMINATOR" type="string" />

<property name="name" />
<property name="age" />

<subclass name="DatabasePerson" extends="Person" >
<id name="databaseId" column="ID">
<generator class="native" />
</id>

</subclass>
</class>

请注意,数据库 ID 位于此 xml 中的 DatabasePerson 范围内。

编辑:此 xml 映射是否对应于注释“映射的父类(super class)”?我想我更喜欢使用 xml 而不是注释,所以我的问题是如何在 xml 中使用 @MappedSuperclass:

<class name="Person" table="PERSON" discriminator-value="P">
<id name="databaseId" column="PERSON_ID">
<generator class="native" />
</id>

<discriminator column="DISCRIMINATOR" type="string" />

<subclass name="DatabasePerson" extends="Person" discriminator-value="E">
<property name="name" column="name" />
<property name="age" type="int" column="age" />
</subclass>
</class>

最佳答案

我认为您可以使用 MappedSupperclass 注释或单表继承策略来仅使用数据库中的一个表。在这两种情况下,JPA/Hibernate 都知道 Person 类,但它不会为此类创建表。 (当然你可以使用 XML 调整而不是注释,但我只使用了注释。)

@MappedSuperclass 注解。

如果您只想使用一个数据库表 (DatabasePerson),其中包含来自两个 java 类的所有列,那么您可以使用以下注释:

@MappedSuperclass
class Person {
String name;
int age;
}

@Entity
class DatabasePerson extends Person {
int databaseId;
}

我认为在这种情况下最好将 Person 类更改为抽象类。


InheritanceType.SINGLE_TABLE

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="yourtype",
discriminatorType=DiscriminatorType.STRING
)
class DatabasePerson{
int databaseId;
}


@Entity
@DiscriminatorValue("P")
class Person extends DatabasePerson{
String name;
int age;
}

这个策略使用鉴别器列并且只保留一个表。

关于java - Hibernate,映射继承字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290926/

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