2011-01-07 54 views
2

の複合キーを使用するデータベースで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を使用します。しかし、それはどこで "繰り返し列"を引き起こすのでしょうか?

答えて

5

私があなたのケースのための実用的なソリューションを持っているようだ:

@Entity 
public class InvestorIssuerEntity { 
    @EmbeddedId 
    private InvestorIssuerEntityPK investorIssuerEntityPK; 

    @OneToOne(optional=true, mappedBy="investorIssuerEntity") 
    private InvestorIssuerEmailEntity investorIssuerEmailEntity; 
} 

@Entity 
public class InvestorIssuerEmailEntity { 
    @EmbeddedId @AttributeOverrides({ 
     @AttributeOverride(name="investorId", [email protected](name="T02_INV_ID")), 
     @AttributeOverride(name="issuerId", [email protected](name="T02_ISS_ID")) 
    }) 
    private InvestorIssuerEntityPK investorIssuerEntityPK; 

    @OneToOne(optional=true) @PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name="T02_ISS_ID", referencedColumnName="T01_ISS_ID"), 
     @PrimaryKeyJoinColumn(name="T02_INV_ID", referencedColumnName="T01_INV_ID") 
    }) 
    private InvestorIssuerEntity investorIssuerEntity; 
} 

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

    @Column(name="T01_INV_ID") 
    private Long investorId; 

    @Column(name="T01_ISS_ID") 
    private Long issuerId; 
} 

それはあなたが探しているもののようです以下のDDL生成:

create table InvestorIssuerEmailEntity (
    T02_INV_ID bigint not null, 
    T02_ISS_ID bigint not null, 
    primary key (T02_INV_ID, T02_ISS_ID) 
) 

create table InvestorIssuerEntity (
    T01_INV_ID bigint not null, 
    T01_ISS_ID bigint not null, 
    primary key (T01_INV_ID, T01_ISS_ID) 
) 

alter table InvestorIssuerEmailEntity 
    add constraint FKC2FBCC4E1E26612E 
    foreign key (T02_INV_ID, T02_ISS_ID) 
    references InvestorIssuerEntity 
+0

どうもありがとうございましたpartenonを、Iこれをテストして問題が解決するかどうかを確認します。 InvestorIssuerEntityにはinvestorId + issuerIdに加わった他の関連団体もありますが、それらのコンポジットキーにも1つの列が追加されています - これが「マッピングの繰り返し列」エラーにならないかどうかがわかります。 – trafalmadorian

+0

jeff303:でも問題はまだ残っています。上の編集された質問の私の注意を見てください。他の誰かがこれが問題を解決したことを確認できますか? – trafalmadorian

+0

あなたの最終的なコードは何か分かりませんので、何が間違っているかを特定することはできません。 – jpkrohling

関連する問題