Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA持久化时覆盖的字段_Java_Jpa_Eclipselink - Fatal编程技术网

Java 使用JPA持久化时覆盖的字段

Java 使用JPA持久化时覆盖的字段,java,jpa,eclipselink,Java,Jpa,Eclipselink,在测试模型的持久性时,我会覆盖一个属性。我正在运行以下测试: @Test public void objectTest() throws Exception { tester.testClass(AssetUpdateReserve.class); Assert.assertEquals(tester.getResult().getErrors().size(), 0, "Errors found"); } 我的AssetUpdateReserve实体: @En

在测试模型的持久性时,我会覆盖一个属性。我正在运行以下测试:

@Test
public void objectTest() throws Exception {
   tester.testClass(AssetUpdateReserve.class);       
   Assert.assertEquals(tester.getResult().getErrors().size(), 0, "Errors found");   
}
我的AssetUpdateReserve实体:

@Entity
@Table(name = "ASSET_UPD_RESERVE")
public class AssetUpdateReserve implements Serializable {

    private static final long serialVersionUID = 6530799190088978893L;

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "partitionId.assetSliceId", column = @Column(name = "PARTITION_ID")),
            @AttributeOverride(name = "partitionId.associatedKey", column = @Column(name = "PARTITION_ID_AK")),
            @AttributeOverride(name = "containerId.id", column = @Column(name = "CONTAINER_ID")),
            @AttributeOverride(name = "containerId.associatedKey", column = @Column(name = "CONTAINER_ID_AK")) })
    private AssetUpdateReserveIndex id;

    // Default JSON/JAXB constructor
    public AssetUpdateReserve() {
    }
}
根据这一点,我应该有一个具有四个属性的主键。但是,associatedKey中的相同名称会使其中一个属性被覆盖(在本例中,CONTAINER_ID_AK会覆盖PARTITION_AD_AK),从而使我的主键只有三个字段。 我试图对最后一个@AttributeOverride进行注释,这解决了问题,并且该表具有PARTITION\u ID\u AK列。然而,我不能简单地忽略容器ID

我的其他实体:

资产许可证

@Embeddable
public class AssetSliceId implements Serializable {
    private static final long serialVersionUID = 9065665917069565503L;

    public static final int MAX_VALUE = Integer.MAX_VALUE;

    @Column(name = "ASSET_SLICE_ID")
    private Integer assetSliceId;

    @Column(name = "ID_AK")
    private String associatedKey;

    public AssetSliceId() {
        super();
    }
}
AssetUpdateReserveIndex:

@Embeddable
public class AssetUpdateReserveIndex implements Serializable {
    private static final long serialVersionUID = 1349614023445826884L;

    @Embedded
    @AttributeOverrides({ @AttributeOverride(name = "assetSliceId", column = @Column(name = "SLICE_ID")),
            @AttributeOverride(name = "associatedKey", column = @Column(name = "SLICE_ID_AK")) })    
    private AssetSliceId partitionId;

    @Embedded
    private InstanceId containerId;

    // Default JSON/JAXB constructor
    public AssetUpdateReserveIndex(){
        super();
    }
}
实例ID

@Embeddable
public class InstanceId implements Serializable {
    private static final long serialVersionUID = -6620668219143108192L;

    @Column(name = "ID")
    private String id;

    @Column(name = "ID_AK")
    private String associatedKey;

    // Apenas para utilizacao TopLink / POF
    public InstanceId() {
    }
}
我的persistence.xlm文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 

http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="jpa-test" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <class>package.persistencetester.model.jpa.attroverride.AssetSliceId</class>      <class>package.persistencetester.model.jpa.attroverride.AssetUpdateReserve</class>       <class>package.persistencetester.model.jpa.attroverride.AssetUpdateReserveIndex</class>       <class>package.persistencetester.model.jpa.attroverride.InstanceId</class      <class>package.persistencetester.model.jpa.attroverride.SubscriptionID</class>

            <properties>
            <!-- Default Login using Oracle for EclipseLink's internal connection pool -->

            <!--  HSQL -->
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:hsql://localhost/persistencetesterdb"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>

            <property name="eclipselink.logging.thread" value="false" />
            <property name="eclipselink.logging.session" value="false" />
            <property name="eclipselink.logging.exceptions" value="false" />
            <property name="eclipselink.logging.timestamp" value="false" />
            <property name="eclipselink.logging.level" value="FINE" />
            </properties>
        </persistence-unit>
</persistence>

注意:在日志中,您可以看到创建表,primarykey只有3个属性,但在插入时,这四个属性是否都有呢在对象关系映射方面没有太多经验,但是如果您的问题是有两个同名的数据,我想您可以使用
@AssociationOverride
来显示一个链接,这是您想要的,我认为本页的以下部分可以帮助您:

    @Embedded  
@AttributeOverrides(  {  
    @AttributeOverride(name="pesoMaximoEnKg", column = @Column(name="pesoMaximoEnKgConductor")),  
}  
@AssociationOverrides({  
    @AssociationOverride(name="cinturon",joinColumns=@JoinColumn(name="cinturonConductor_id")),  
})  
Asiento asientoConductor;


@Embedded  
@AttributeOverrides(  {  
    @AttributeOverride(name="pesoMaximoEnKg", column = @Column(name="pesoMaximoEnKgCopiloto")),  
}  
@AssociationOverrides({  
    @AssociationOverride(name="cinturon",joinColumns=@JoinColumn(name="cinturonCopiloto_id")),  
})  
Asiento asientoCopiloto;
附言:这个页面是西班牙语的,但我认为谷歌翻译会做得很好。 如果不是您想要的或无法为您提供的,我将通知我删除。

根据“不支持在嵌入式id类中定义的关系映射”

因为
containerId
partitionId
都包含一个名为
associatedKey
的字段,并且它们不能映射到
@EmbeddedId
类中的单独实体,所以表不是用主键中的所有四个值创建的(因为它会看到两次
associatedKey
,并丢弃重复项)。

如果查看“展平的”
AssetUpdateReserveIndex
结构,同一属性名有两个映射(
associatedKey
),后者会覆盖前者。我希望EclipseLink会出现某种验证异常,但您在日志中看到的(3个属性用于create table,4个属性用于insert)可能表明它们没有完全覆盖此特定情况。简单的解决方案是更改其中一个冲突字段的名称

    @Embedded  
@AttributeOverrides(  {  
    @AttributeOverride(name="pesoMaximoEnKg", column = @Column(name="pesoMaximoEnKgConductor")),  
}  
@AssociationOverrides({  
    @AssociationOverride(name="cinturon",joinColumns=@JoinColumn(name="cinturonConductor_id")),  
})  
Asiento asientoConductor;


@Embedded  
@AttributeOverrides(  {  
    @AttributeOverride(name="pesoMaximoEnKg", column = @Column(name="pesoMaximoEnKgCopiloto")),  
}  
@AssociationOverrides({  
    @AssociationOverride(name="cinturon",joinColumns=@JoinColumn(name="cinturonCopiloto_id")),  
})  
Asiento asientoCopiloto;