【发布时间】:2024-09-02 19:20:02
【问题描述】:
假设我有以下类层次结构:
class Person {
String name;
int age;
}
class DatabasePerson extends Person {
int databaseId;
}
现在我想映射DatabasePerson,请注意我不想告诉hibernate存在一个Person类,hibernate应该只知道DatabasePerson类,而xml或注解映射。是否可以使用采用上述条件的休眠映射年龄和姓名字段?换句话说,我想用hibernate映射DatabasePerson类,而hibernate不应该知道Person类。在xml中我会这样(伪代码):
<hibernate class="DatabasePerson">
<field name="id"/>
<field name="name"/>
<field name="age"/>
</hibernate>
这样做的原因是为了保持单一责任原则。我不想将 databaseId 字段放入 Person 类,因为 person 类不应该知道它是持久的。我不想在 Person 类中包含任何休眠注释,因为我有纯实体逻辑,我不想在那里导入任何与数据库相关的东西,比如休眠。我想在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 映射是否与注释“映射的超类”相对应?我想我更喜欢使用 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>
【问题讨论】: