【问题标题】:eclipselink inheritance implementationeclipselink继承实现
【发布时间】:2013-05-06 23:48:14
【问题描述】:

我正在尝试在我的项目中实现 ElcipseLink JPA2.0 以进行继承。 不能使用注释。只有 xml 映射。

这是我的代码。 公共类 DefaultEntity {

}

public class SpecialEntity extends DefaultEntity {
public String name; 
public int age; 
}

public class AnotherSplEntity extends DefaultEntity {
long ts;
String pkey; 

}

public class MyPersistableEntity {

public DefaultEntity de; 

public void setMyPersistableEntity(DefaultEntity de) {
  // any subclass can be assigned here. 
  this.de = de
}

这是我的 ORM.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"      version="2.3">

<persistence-unit-metadata>
    <exclude-default-mappings />
</persistence-unit-metadata>
<entity  class="MyPersistableEntity">
<attributes>
<one-to-one name="de">
<cascade>
<cascade-all />
</cascade>
</one-to-one>
</attributes>
</entity>
<mapped-superclass class="DefaultEntity">
<attributes>
<id name="id" attribute-type="long">
<generated-value strategy="SEQUENCE" />
</id>

</attributes>
</mapped-superclass>
<entity class="SpecialEntity" >
    <attributes>
        <id name="id" attribute-type="long">
            <generated-value strategy="SEQUENCE" />
        </id>
        <basic name="name" attribute-type="String" />
        <basic name="age" attribute-type="int" />
    </attributes>
</entity>
</entity-mappings>

我一直在 " 在关系属性 [field de] 中使用非实体 [class DefaultEntity] 作为目标实体"

如何让 EclipseLink 识别实际分配的类并使用该映射?

有什么想法吗?最重要的是,可以使用 EcliseLink 完成吗?

谢谢 戈皮

【问题讨论】:

    标签: inheritance jpa eclipselink mappedsuperclass


    【解决方案1】:

    如果您希望引用为 SpecialEntity,则需要设置目标实体,

    看, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Target_Entity

    或者更好,只需将字段的类型更改为 SpecialEntity。

    如果两者都可以,则不能使用 MappedSuperclass,需要制作 DefaultEntity 和 Entity 并映射继承。

    【讨论】:

    • 嗨,詹姆斯,感谢您的回复。我不能使用目标,因为它可能是任何一个子类。而且我也不能将字段声明为子类。我正在查看您提到的最后一个选项,您能解释一下该选项吗?我也不能使用鉴别器值/列选项。
    【解决方案2】:

    终于找到了办法。 所以我也为 Abstract 类替换并创建了一个。不确定这是否是 EclipseLink 的错误。另一个问题是使用生成值策略“SEQUENCE”(可能是其他)无法正确生成序列。

    我的 orm 如下所示

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <entity-mappings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" version="2.3">
    
    <persistence-unit-metadata>
        <exclude-default-mappings />
    </persistence-unit-metadata>
    
    <entity  class="ABC">
        <table name="" />
        <attributes>
            <id .......>
            </id>
            <basic name="ts" attribute-type="long" />
            <one-to-one name="field-referring-to-abstract-class" >
                <join-column name="ABSTRACT_ID"/>
                <cascade>
                    <cascade-all />
                </cascade>
            </one-to-one>
        </attributes>
    </entity>
    
    
    <entity class="ABSTRACT-CLASS" >
        <table name="ABSTRACT-TABLE"/>  
        <inheritance strategy="TABLE_PER_CLASS" />
        <attributes>
            <id name="ABSTRACT_ID" attribute-type="String" >
                <column name="ABSTRACT_ID" />
            </id>
        </attributes>
    </entity>
    
    
    <entity class="SUB-CLASS1-TO-ABSTRACT" access="FIELD">
         <table name="SUBCLASS1"/>
        <attributes>
            <basic name="name" attribute-type="String" />
            <basic name="age" attribute-type="int" />
        </attributes>
    </entity>
    
    <entity class="SUB-CLASS2-TO-ABSTRACT" access="FIELD">
         <table name="SUBCLASS2"/>
        <attributes>
            <basic name="city" attribute-type="String" />
            <basic name="zipcode" attribute-type="int" />
        </attributes>
    </entity>
    </entity-mappings>
    

    所以,当我们在我提供的子类中读取提供的 PK 时,这将存储到适当的表中,具有唯一性。

    希望这会有所帮助 谢谢 戈皮

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多