2017-03-16 4 views
1

私は2つのテーブル:reportとflyleafを持っています。レポートはフライリーフテーブルの外部キーとプライマリキーである 'id'と 'index'によって識別されます。コンポジットプライマリキーと1対1の一方向の関連付けを行うためのHibernateアノテーション

テーブルのスキーマは、次のとおりです。私は、一方向の方法でこの関連をマッピングするためにHibernateアノテーションを使用

CREATE TABLE `report` (
    `id` int(11) NOT NULL, 
    `index` varchar(5) NOT NULL, 
    `nb_page` int(11) DEFAULT NULL 
); 
ALTER TABLE `report` ADD PRIMARY KEY (`id`,`index`); 

CREATE TABLE `flyleaf_t` (
    `id` int(11) NOT NULL, 
    `index` varchar(5) NOT NULL, 
    `title` varchar(30) DEFAULT NULL, 
    `author` varchar(30) DEFAULT NULL, 
    `checker` varchar(30) DEFAULT NULL 
); 
ALTER TABLE `flyleaf` ADD PRIMARY KEY (`id`,`index`); 
ALTER TABLE `flyleaf` ADD CONSTRAINT `flyleaf_ibfk_1` FOREIGN KEY (`id`,`index`) REFERENCES `report` (`id`, `index`); 

。単純なキー(コンポジットではない)を使用すると、明らかにうまく動作しますが、コンポジット・キーを使用しようとすると、「org.hibernate.TypeMismatchException」に「lgmi_cr.Flyleafクラスのタイプが間違っています」というメッセージがスローされます。期待されるクラス:クラスlgmi_cr.Flyleaf、クラスlgmi_cr.Reportを取得しました。 "

誰かが同じケースを既に見たか、この関連を単方向で一対一に表現する方法についてのアイデアがあれば、その助けに感謝します。

EDIT:これは、Idがマッピング

@Entity 
@Table(name="report") 
public class Report implements Serializable{ 

    @Id 
    @Column(name = "id") 
    private int id; 

    @Id 
    @Column(name = "index") 
    private String index; 

    @OneToOne 
    @JoinColumns({@JoinColumn(name="id", referencedColumnName="id"), 
      @JoinColumn(name="index", referencedColumnName="index")}) 
    private Flyleaf flyleaf; 
... 

@Entity 
@Table(name="flyleaf") 
public class Flyleaf implements Serializable { 

    @Id 
    @Column(name = "id") 
    private int id; 

    @Id 
    @Column(name = "index") 
    private String index; 
.... 

を行なったし、私はこの例外「org.hibernate.TypeMismatchException得た方法である:クラスlgmi_cr.Flyleafのための間違った種類の提供されたIDを期待:クラスlgmi_cr .Flyleaf、クラスlgmi_cr.Reportを取得しました。 "

答えて

1

私はあなたがHibernateでこれらの関係をどのようにマッピングしているのか分かりましたか?これは私がそれを行うだろうかです:

1)例えば、@Embeddableアノテーションを使って別のクラスのオブジェクトとして各複合表の地図:

@Embeddable 
public class ReportPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name="id") 
    private int id; 
    @Basic(optional = false) 
    @Column(name="index") 
    private String index; 
... 

とエンティティクラスは次のようになります。

@Table(name="report") 
public class Report implements Serializable { 

    @EmbeddedId 
    protected ReportPK id; 
... 

2)フライリーフのエンティティクラスでは、あなたのように一方向のマッピングを追加することができます:おそらく

@OneToOne 
    @JoinColumns({ 
    @JoinColumn(name="id", 
     referencedColumnName="id"), 
    @JoinColumn(name="index", 
     referencedColumnName="index"), 
    }) 
    private Report report; 
... 

これが役に立たない場合は、より具体的にすることができます。 :-)

+0

ありがとうございます@nkmuturi。あなたの解決策は動作し、私は単方向マッピングを反転させます(フライリーフをレポートにマップする)。あなたはコードと使用されているメカニズム(私は休止状態を使用して新しいです)についての詳細を教えてください? –

+0

Idアノテーションは、単一の主キーを含むテーブルへのマッピングに使用されます。ただし、複合主キーを持つ表の場合は、IdClassまたはEmbeddableが使用されます。詳しい説明はこちらhttp://www.objectdb.com/java/jpaententityとこの電子ブックhttp://www.ebooks.com/602765/beginning-hibernate/linwood-jeff-minter-dave/を参照してください。 – nkmuturi

+0

私はこの本を読んで始めました。私は別の質問があります。この注釈はレポートを削除すると、関連するフライリーフは自動的に削除されるのでしょうか、いくつかのカスケードパラメータを追加する必要がありますか? あなたの答えで私はその質問に答えていると思います。 –

関連する問題