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フィールドvalue1
、value2
、そしてvalue3
が含まれて
おかげ
あなたの提案に誤りがあるため、私の質問が更新されました。 thxs – davisoski
Hibernateは 'SecondTablePK'にプライマリキー全体を含めることを期待しています(つまり、 "部分キー" 'private int id'ではなく' private MainTablePK mainTable')。あなたの外部キーが 'MainTable'のプライマリキーの* part *だけを含んでいるのはちょっと問題です。 –
これは、これと似たような別の投稿ではできません。https:// stackoverflowとにかく、ありがとう、コンポジットキーとの1対多の双方向の関係 - jpa-joincolumn-one-to-many-bi-directional-relationship-42245223 – davisoski