0

我正在尝试在我的项目中实现 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 完成吗?

谢谢戈皮

4

2 回答 2

1

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

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

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

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

于 2013-05-07T14:08:27.497 回答
0

终于找到了办法。所以我也为 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 时,这将存储到适当的表中,具有唯一性。

希望这有助于感谢 Gopi

于 2013-05-07T23:33:51.660 回答