JPA:复合主键和外键

时间:2013-09-30 07:29:01

标签: java orm annotations jpa-2.0 one-to-one

我的情况是我有一些遗产表。
资产,具有复合PK(assetId,fiscalId,recordType)
AssetSystems,具有复合PK(assetId,fiscalId,systemId)

他们有关系 资产1 - 1 AssetSystems
其中,Systems FK(assetId,fiscalId)

这是我的代码。

Asset.java

@Entity
@Table(name="Assets")
public class Asset implements Serializable {

@EmbeddedId
private AssetKey compositeKey;

@OneToOne(fetch=FetchType.LAZY, mappedBy="asset")
private AssetSystem assetSystem;

    // other fields and setters - getters

}

AssetKey.java

@Embeddable
public class AssetKey implements java.io.Serializable {

@Column(name="assetID")
private String assetID;

@Column(name="fiscalPeriodID")
private BigInteger fiscalPeriodID;

@Column(name="recordType")
private String recordType;

// setter - getter

}

AssetSystem.java

@Entity
@Table(name="AssetSystems")
public class AssetSystem implements Serializable {

@EmbeddedId
private AssetSystemKey compositeKey;

@OneToOne
@PrimaryKeyJoinColumns({
    @PrimaryKeyJoinColumn(name="assetID", referencedColumnName="assetID"),
    @PrimaryKeyJoinColumn(name="fiscalPeriodID", referencedColumnName="fiscalPeriodID")
})
private Asset asset;

// other fields and setter - getter

}

AssetSystemKey.java

@Embeddable
public class AssetSystemKey implements Serializable {

@Column(name="assetID")
private String assetID;

@Column(name="fiscalPeriodID")
private BigInteger fiscalPeriodID;

@Column(name="systemID")
private BigInteger systemID;

// setter - getter
}

当我尝试访问数据库时,我得到了这个异常

  

java.lang.IllegalArgumentException异常:   org.hibernate.TypeMismatchException:提供了错误类型的id   class com.wb.adapter.model.AssetSystem。预期:上课   com.wb.adapter.model.AssetSystemKey,上课了   com.wb.adapter.model.AssetKey at   org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:274)at at   com.wb.adapter.main.AssetDbReader.readDB(AssetDbReader.java:47)at at   com.wb.adapter.main.AssetDbReader.main(AssetDbReader.java:30)导致   by:org.hibernate.TypeMismatchException:提供错误类型的id   对于类com.wb.adapter.model.AssetSystem。预期:上课   com.wb.adapter.model.AssetSystemKey,上课了   com.wb.adapter.model.AssetKey

我还尝试用简单的 JoinColumn 替换 PrimaryKeyJoinColumns ,这会导致此异常。

  

引起:org.hibernate.AnnotationException:   referencedColumnNames(assetID,fiscalPeriodID)的   com.wb.adapter.model.AssetSystem.asset引用   com.wb.adapter.model.Asset未映射到单个属性

我是JPA的新手,不知道我做错了什么。此外,是否有更好的方法来模拟JPA中的上述表格,这实际上将解决此问题。

非常感谢提前。

萨赫勒

1 个答案:

答案 0 :(得分:0)

尝试用@JoinColumns替换@PrimaryKeyJoinColumns,并为资产参考添加@MapsId(“compositeKey”)。