2017-06-16 17 views
1

LEGACYデータベーススキーマからjpaモデルを作成しようとしています。JPAマッピング異なる列名を持つ複合キー間のOneToMany

私はmysqlで単純なデータベースを作成しました。私は、Eclipse(Reverse)でjpaツールを使用してモデルを生成しました。

JPAツールによって生成されたコードは、私のspringbootプロジェクトにエラーを与える

org.springframework.beans.factory.BeanCreationException:名前を持つBeanを作成エラー「のEntityManagerFactory」 クラスパスリソースに定義されている[ORG/springframework /boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]:

initメソッドの呼び出しに失敗しました。ネストされた例外はorg.hibernate.AnnotationExceptionです:SecondTableに私のPKは(あるため、単一のプロパティ

にマップされていないstackoverflow.entity.MainTableを参照stackoverflow.entity.SecondTable.mainTable のreferencedColumnNames(ID)は、私はそれが意味をなさないと思いますid、day)、MainTableは(id、年、月、コード)です。 今、アイデアを関連付けることがアイデアです。

いくつかのリンク:属性のオーバーライドについては https://gigsterous.github.io/engineering/2016/09/25/spring-boot-2.html

(多分関連していない列を指定) http://techqa.info/programming/question/33620473/hibernate-bidirectional-one-to-many-with-composite-key

JPA: Entity mapping with composite primary key and single key

これらは、JPAツールによって作成された4つのエンティティです:

@Entity 
@Table(name="main_table") 
public class MainTable implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private MainTablePK id; 

    private String comment; 

    //bi-directional many-to-one association to SecondTable 
    @OneToMany(mappedBy="mainTable") 
    private List<SecondTable> secondTables; 

    public MainTable() { 
    } 

} 

@Embeddable 
public class MainTablePK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private int id; 

    private String year; 

    private String month; 

    private String code; 

    public MainTablePK() { 
    } 
} 

@Entity 
@Table(name="second_table") 
public class SecondTable implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private SecondTablePK id; 


    //bi-directional many-to-one association to MainTable 

    //I think I don’t need a bi-directional relationship, just from MainTable to SecondTable 

    //ERROR: NOT MAPPED TO A SINGLE PROPERTY 
    //I understand id in MainTable is a composite Key 
    @ManyToOne 
    @JoinColumn(name="id", referencedColumnName="id") 
    private MainTable mainTable; 


    public SecondTable() { 
    } 
} 


@Embeddable 
public class SecondTablePK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private int id; 

    private int day; 

    private int value1; 

    private int value2; 

    private int value3; 

    public SecondTablePK() { 
    } 
} 

SCRIPT SQLとexampデータの

DROP TABLE IF EXISTS `main_table`; 
CREATE TABLE `main_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `year` char(4) NOT NULL, 
    `month` char(2) NOT NULL, 
    `code` char(6) NOT NULL, 
    `comment` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`id`,`year`,`month`,`code`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; 

INSERT INTO `main_table` VALUES (1,'2017','01','333090','coment one'); 

This has a composite key 

DROP TABLE IF EXISTS `second_table`; 
CREATE TABLE `second_table` (
    `id` int(11) NOT NULL, 
    `day` int(11) NOT NULL, 
    `value1` int(11) DEFAULT NULL, 
    `value2` int(11) DEFAULT NULL, 
    `value3` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`,`day`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


INSERT INTO `second_table` VALUES (1,0,1,NULL,NULL),(1,1,2,NULL,NULL),(1,2,NULL,NULL,NULL),(1,3,NULL,NULL,NULL),(1,4,NULL,NULL,NULL),(1,32,NULL,NULL,NULL); 

JPAを使用して実装することは可能ですか? 提案がありますか?

おかげ

非PKフィールド値1、値2、値3とを削除UPDATE

は、タイプミスでした。

JPA 2.1の仕様、2.4.1の例2の34,35ページは、私のものと非常によく似ています。

だから、適用:

@MapsId("empPK") 
       @JoinColumns({ 
@JoinColumn(name="FK1", referencedColumnName="firstName"), 
@JoinColumn(name="FK2", referencedColumnName="lastName") }) 

を我々は持っている:

@ManyToOne 
@MapsId("id") // maps the 'id' attribute of the embedded ID 
@JoinColumn(name="id", referencedColumnName="id") 
private MainTable mainTable; 

これ以上の変更は行われません。

は、私は次のエラーを取得: org.springframework.beans.factory.BeanCreationException:エラーは、名前のBeanを作成する 'のEntityManagerFactory' クラスパスリソースに定義されている[ORG/springframework /ブーツ/自動設定/ ORM/JPA/HibernateJpaAutoConfiguration.class] :initメソッドの呼び出しに失敗しました。ネストされた例外はorg.hibernateです。AnnotationException:@MapsIdマッピングで列の参照を見つけることができません:コード

私はで、月に同じエラーを削除した場合、私は、でコード、同じエラーけどを削除した場合。それは非PKフィールドvalue1value2、そしてvalue3が含まれて

おかげ

答えて

0

まず、あなたのSecondTablePKが間違って表示されます。共有idに関しては

@Embeddable 
public class SecondTablePK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private int id; 

    private int day; 

    public SecondTablePK() { 
    } 
} 

:一般的に、依存エンティティは、親エンティティの全体主キーを参照しますが、このような関係をマッピングすることができるかもしれない:

それはおそらく次のようになります。
@Entity 
@Table(name="second_table") 
public class SecondTable implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private SecondTablePK id; 

    private int value1; 

    private int value2; 

    private int value3; 

    @ManyToOne 
    @MapsId("id") // maps the 'id' attribute of the embedded ID 
    @JoinColumn(name="id", referencedColumnName="id") 
    private MainTable mainTable; 


    public SecondTable() { 
    } 
} 

これは、JPA 2.1仕様の2.4.1項で説明されている「派生アイデンティティ」とよく似ています。

+0

あなたの提案に誤りがあるため、私の質問が更新されました。 thxs – davisoski

+0

Hibernateは 'SecondTablePK'にプライマリキー全体を含めることを期待しています(つまり、 "部分キー" 'private int id'ではなく' private MainTablePK mainTable')。あなたの外部キーが 'MainTable'のプライマリキーの* part *だけを含んでいるのはちょっと問題です。 –

+0

これは、これと似たような別の投稿ではできません。https:// stackoverflowとにかく、ありがとう、コンポジットキーとの1対多の双方向の関係 - jpa-joincolumn-one-to-many-bi-directional-relationship-42245223 – davisoski

関連する問題