の複合キーを使用するデータベースでHibernateを使用しようとしています。 残念ながら、スキーマを変更することはできませんので、フィールド間でさらに多くのマッピングを行う必要があります。私たちは、JPA 1.0とHibernate 3.3を使用することに制限されています。JPA OneToOneの関連付けで、2つのエンティティが複合主キーを使用しますが、異なる列名を使用しますか?
我々はこれまで持っていた最大の問題 はテーブルがこれらの列に異なる名前 を持つ2つの値の複合キーを使用して2つのエンティティ間の1対1の関連、(DBを持っていると行うことです各列のテーブル固有の接頭辞を持つの命名規則)
私たちは私たちのクエリを実行するたびに、私たちは、この例外を取得:。、これらのテーブルのための2つのクラス、InvestorIssuerEntityとInvestorIssuerEmailEntity
Caused by: org.hibernate.TypeMismatchException Provided id of the wrong type for class com.business.entity.InvestorIssuerEmailEntity.
Expected: class com.business.entity.InvestorIssuerEmailEntityPK, got class com.business.entity.InvestorIssuerEntityPK;
持っていますオプションの@OneToOneアロケーション (InvestorIssuerEmailには一致するレコードがありませんInvestorIssuerいくつかのケースで):私は2つのエンティティのための@EmbeddableIdと同じクラスを使用して、使用して型の不一致問題を回避しようとしました
を@IdClass(InvestorIssuerEntityPK.class)
@Table(name = "T090_INVESTOR_ISSUER")
@Entity
InvestorIssuerEntity
@Column(name = "T090_091_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T090_102_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
(other fields omitted)
@OneToOne(optional = true)
@JoinColumns(value = {
@JoinColumn(name="T090_091_INVESTOR_ID", referencedColumnName = "T284_INVESTOR_ID", nullable = false, insertable = false, updatable = false),
@JoinColumn(name = "T090_102_ISSUER_ID", referencedColumnName = "T284_ISSUER_ID", nullable = false, insertable = false, updatable = false)
})
@NotFound(action = NotFoundAction.IGNORE)
private InvestorIssuerEmailEntity investorIssuerEmail;
...
InvestorIssuerEntityPK
@Id
@Column(name = "T090_091_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
private Long investorId;
@Id
@Column(name = "T090_102_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
private Long issuerId;
...
@IdClass(InvestorIssuerEmailEntityPK.class)
@Table(name = "T284_INVESTOR_ISSUER_EMAIL")
@Entity
InvestorIssuerEmailEntity
@Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T284_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
...
InvestorIssuerEmailEntityPK
@Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long investorId;
@Column(name = "T284_ISSUER_ID", nullable = false, insertable = true,
updatable = true, length = 18, precision = 0)
@Id
private Long issuerId;
@このようなAttributeOverrides、:
@Id
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "investorId",
column = @Column(name = "T284_INVESTOR_ID", nullable = false, insertable = true, updatable = true, length = 18, precision = 0)),
@AttributeOverride(name = "issuerId",
column = @Column(name = "T284_ISSUER_ID", nullable = false, insertable = true, updatable = true, length = 18, precision = 0))
})
private InvestorIssuerId investorIssuerId;
私だけまだそれはあなただけのエンティティの@IdClass OR @EmbeddableIdを使用した場合です(他のエンティティのための@IdClassのアプローチを使用して、しかしこれら2つのエンティティの変更をしました、両方ともではありません)
私たちは終わります「エンティティのマッピングで列を繰り返す」のような他の問題が発生したため、このアプローチに戻って、これに他の回避策があるかどうかを確認しました。
この問題を解決する方法はありますか?私はStackOverflowの周りを見てきましたが、アソシエーションで使用されているコンポジット・キーの名前が異なる場合はありません。
注: でも以下の提案をしようとした後、我々はまだ、このエラーが出る:org.hibernate.MappingException:エンティティのマッピングで繰り返さコラム:com.business.entity.InvestorIssuerEntityコラム:T090_091_INVESTOR_IDは(でマッピングする必要があります
私はInvestorIssuerEntityとからすべての関連付けを削除しましたが、まだに同じ問題がありました。コンポジット・キー・クラスの@Columnアノテーションを削除すると、エラーが消えてしまいます。もちろん、investorIdがマップされていないため、クエリは機能しませんでした。私は理解していません Hibernateが複合キー以外のT090_091_INVESTOR_IDのすべての言及をすでに削除していたので、Hibernateが "マッピングの繰り返し列"を見つけていたところです。
InvestorIssuerEntityには、同じ主キーの結合を行う他の関連がありますが、関連するエンティティも複合キーに追加の列を持ちます。 @EmbeddedIdを使用すると、それらをすべてのエンティティに使用する予定ですか?他のクラスには@IdClassを使用します。しかし、それはどこで "繰り返し列"を引き起こすのでしょうか?
どうもありがとうございましたpartenonを、Iこれをテストして問題が解決するかどうかを確認します。 InvestorIssuerEntityにはinvestorId + issuerIdに加わった他の関連団体もありますが、それらのコンポジットキーにも1つの列が追加されています - これが「マッピングの繰り返し列」エラーにならないかどうかがわかります。 – trafalmadorian
jeff303:でも問題はまだ残っています。上の編集された質問の私の注意を見てください。他の誰かがこれが問題を解決したことを確認できますか? – trafalmadorian
あなたの最終的なコードは何か分かりませんので、何が間違っているかを特定することはできません。 – jpkrohling