2013-09-30 2 views
0

У меня есть ситуация, когда у меня есть несколько старых таблиц.
активы, с композитным PK (AssetID, fiscalId, RECORDTYPE)
AssetSystems, с композитным PK (AssetID, fiscalId, SYSTEMID)JPA: Составные первичные и внешние ключи

И они имеют отношения.
Asset 1 - 1 AssetSystems
где, системы 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: При условии, идентификатор неправильного типа для класса com.wb. adapter.model.AssetSystem. Ожидаемый: класс com.wb.adapter.model.AssetSystemKey, получил класс com.wb.adapter.model.AssetKey в org.hibernate.ejb.QueryImpl.getResultList (QueryImpl.java:274) в com.wb. adapter.main.AssetDbReader.readDB (AssetDbReader.java:47) в com.wb.adapter.main.AssetDbReader.main (AssetDbReader.java:30) Вызвано by: org.hibernate.TypeMismatchException: Предоставлен идентификатор неправильного типа для класса com.wb.adapter.model.AssetSystem. Ожидаемый: класс com.wb.adapter.model.AssetSystemKey, получил класс com.wb.adapter.model.AssetKey

Я также попытался заменить PrimaryKeyJoinColumns с простыми JoinColumn что приводит к этой исключение.

вызвано следующими причинами: org.hibernate.AnnotationException: referencedColumnNames (AssetID, fiscalPeriodID) из com.wb.adapter.model.AssetSystem.asset ссылающихся com.wb.adapter.model.Asset не сопоставляется с одно имущество

Я новичок в JPA и не уверен, что я делаю неправильно. Кроме того, существует ли лучший способ моделирования вышеупомянутых таблиц в JPA, что позволит решить эту проблему.

Большое спасибо заранее.

Сахил

+0

Вы обнаружили, что не так с вашим кодом? – squallsv

ответ

0

Попробуйте заменить @PrimaryKeyJoinColumns с @JoinColumns и добавить @MapsId ("compositeKey") для справки активов.

+0

Это дает - Тип идентификатора, сопоставленного активностью отношения, не согласуется с классом первичного ключа целевого объекта. –

Смежные вопросы