0

我在这里找到了我的任务的解决方案:mixing-joined-and-single-table-inheritance。问题包含混合两种继承策略的示例:与单个表连接。但是,是否可以将此注解映射转换为 XML 映射?

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "animals")
public abstract class Animal { ...

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Mammal extends Animal { ...

@Entity
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@DiscriminatorValue(value = "dog")
public class Dog extends Mammal { ...

@Entity
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@DiscriminatorValue(value = "cat")
public class Cat extends Mammal { ...
4

1 回答 1

1

抱歉,昨天我刚刚发布了一些从一级继承概念化的代码摘录。你遇到的问题是由

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

不能放在 <subclass> 下并且 <joint-subclass> 不能嵌套。我今天尝试运行类似的代码来实现您可能需要的功能。我试图将 <join> 放在 <subclass> 下以模拟 <joint-subclass>,但 <discriminator> 不会以这种方式工作。

所以我唯一能想到的就是在动物和哺乳动物之间建立一对一的关联。这是我尝试过的代码,这个概念可能看起来很尴尬。

    <hibernate-mapping>
<class name="bean.Animal" table="animal">
    <id name="id" type="java.lang.Integer">
        <column name="id" length="50" scale="0" />
    </id>
     <many-to-one name="mammal" 
    column="mammal_id"
    not-null="true"/>
</class>

<class name="bean.Mammal" table="mammal">
    <id name="mammal_id" type="java.lang.Integer">
        <column name="mammal_id" length="50" scale="0" />
    </id>
    <discriminator column="type" type="string"/>

     <subclass name="bean.Dog" extends="bean.Mammal" discriminator-value="dog">
        </subclass>
        <subclass name="bean.Cat" extends="bean.Mammal" discriminator-value="cat">
        </subclass>
</class>

结果表是:

+------------------------------+
|桌子 |
+------------------------------+
|动物 |
|哺乳动物 |
+------------------------------+

这些表中的模式是

+------------------------------+
|动物 |
+------------------------------+
|标识 |
|哺乳动物 ID |
+------------------------------+

+------------------------------+
|哺乳动物 |
+------------------------------+
|哺乳动物 ID |
|类型 |
+------------------------------+

希望这会有所帮助。顺便说一句,我仍然想知道你不使用注释来解决这个问题的原因是什么,因为你有解决方案,只是好奇:)。

于 2012-11-06T21:22:38.027 回答