У меня есть ситуация, когда у меня есть несколько старых таблиц.
активы, с композитным 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, что позволит решить эту проблему.
Большое спасибо заранее.
Сахил
Вы обнаружили, что не так с вашим кодом? – squallsv