質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

2040閲覧

Spring JPAで複合主キーを設定して起動するにはどうしたらよいのでしょうか?

yuki1111

総合スコア72

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2020/02/25 12:57

編集2020/02/25 13:00

Spring JPAで複合主キーを設定して起動するにはどうしたらよいのでしょうか?

https://qiita.com/shotana/items/906d0596ce152fe3c6c1を参考にやってみたのですが、できません。
QuestionPkcの各フィールドに@Embeddedを付与しても同じエラーで起動できません。
どこを修正すればよいのでしょうか?

log

1Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 22020-02-25 21:50:26.150 ERROR 12888 --- [ main] o.s.boot.SpringApplication : Application run failed 3 4org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unable to find properties (timeSegment, period, questionNo, yearNumber, examinationYear) in entity annotated with @IdClass:com.koikeya.project1.domain.model.Question 5 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) 6 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) 7 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) 8 at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) 9 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 10 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 11 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 12 at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) 13 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) 14 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) 15 at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) 16 at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782) 17 at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:404) 18 at org.springframework.boot.SpringApplication.run(SpringApplication.java:319) 19 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1275) 20 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1263) 21 at com.koikeya.project1.Project1Application.main(Project1Application.java:18) 22Caused by: org.hibernate.AnnotationException: Unable to find properties (timeSegment, period, questionNo, yearNumber, examinationYear) in entity annotated with @IdClass:com.koikeya.project1.domain.model.Question 23 at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:1003) 24 at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:802) 25 at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:254) 26 at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:230) 27 at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:273) 28 at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:900) 29 at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:931) 30 at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) 31 at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) 32 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) 33 at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) 34 at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) 35 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1841) 36 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) 37 ... 16 common frames omitted

java

1/** 2 * 問題エンティティクラス 3 * 4 * @author Yuki Koike 5 */ 6@Data 7@Entity 8@IdClass(QuestionPkc.class) 9@Table(name = "QUESTION") 10public class Question { 11 12 /** 13 * 問題マスタ主キー 14 */ 15 @EmbeddedId 16 private QuestionPkc questionPkc; 17 18 /** 19 * 問題文 20 */ 21 @Column(name = "SENTENCE_OF_QUESTION") 22 private String sentenceOfQuestion; 23 24 /** 25 * 選択肢ア 26 */ 27 @Column(name = "FIRST_OPINION") 28 private String firstOpinion; 29 30 /** 31 * 選択肢イ 32 */ 33 @Column(name = "SECOND_OPINION") 34 private String secondOpinion; 35 36 /** 37 * 選択肢ウ 38 */ 39 @Column(name = "THIRD_OPINION") 40 private String thirdOpinion; 41 42 /** 43 * 選択肢エ 44 */ 45 @Column(name = "FOURTH_OPINION") 46 private String fourthOpinion; 47 48 /** 49 * 更新日時 50 */ 51 @Column(name = "UPDATED_AT", insertable = false, updatable = false) 52 private String updatedAt; 53 54 /** 55 * 登録日時 56 */ 57 @Column(name = "CREATED_AT", insertable = false) 58 private String createdAt; 59 60 /** 61 * 版 62 */ 63 @Version 64 @Column(name = "VERSION", insertable = false) 65 private int version; 66}

java

1/** 2 * 問題マスタ主キー定義クラス 3 * 4 * @author Yuki Koike 5 * 6 */ 7@Data 8@Embeddable 9public class QuestionPkc implements Serializable { 10 11 /** 12 * 年号 13 */ 14 @Embedded 15 @Column(name = "YEAR_NUMBER") 16 private String yearNumber; 17 18 /** 19 * 年 20 */ 21 @Column(name = "EXAMINATION_YEAR") 22 private String examinationYear; 23 24 /** 25 * 期 26 */ 27 @Column(name = "PERIOD") 28 private String period; 29 30 /** 31 * 時間区分 32 */ 33 @Column(name = "TIME_SEGMENT") 34 private String timeSegment; 35 36 /** 37 * 問題番号 38 */ 39 @Column(name = "QUESTION_NO") 40 private String questionNo; 41}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/26 00:00

どう作るかわからないなら hibernate tools
yuki1111

2020/02/27 16:47

hibernate toolsが僕が使っているeclipseのバージョン(Photon Release (4.8.0))に対応していなかったので、ググりながら自力で解決しました。しかし使えたら便利ですねhibernate tools。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/02/28 06:34

maven-plugin / ant 実行なら eclipse のバージョンは関係なし
guest

回答1

0

自己解決

下記のように実装したらできました。

参考

Java

1package com.koikeya.project1.domain.model; 2 3import javax.persistence.Column; 4import javax.persistence.Entity; 5import javax.persistence.Id; 6import javax.persistence.IdClass; 7import javax.persistence.Table; 8import javax.persistence.Version; 9 10import lombok.Data; 11 12/** 13 * 問題エンティティクラス 14 * 15 * @author Yuki Koike 16 */ 17@Data 18@Entity 19@IdClass(QuestionPkc.class) 20@Table(name = "QUESTION") 21public class Question { 22 23 /** 24 * 年号 25 */ 26 @Id 27 @Column(name = "YEAR_NUMBER") 28 private String yearNumber; 29 30 /** 31 * 年 32 */ 33 @Id 34 @Column(name = "EXAMINATION_YEAR") 35 private String examinationYear; 36 37 /** 38 * 期 39 */ 40 @Id 41 @Column(name = "PERIOD") 42 private String period; 43 44 /** 45 * 時間区分 46 */ 47 @Id 48 @Column(name = "TIME_SEGMENT") 49 private String timeSegment; 50 51 /** 52 * 問題番号 53 */ 54 @Id 55 @Column(name = "QUESTION_NO") 56 private String questionNo; 57 58 /** 59 * 問題文 60 */ 61 @Column(name = "SENTENCE_OF_QUESTION") 62 private String sentenceOfQuestion; 63 64 /** 65 * 選択肢ア 66 */ 67 @Column(name = "FIRST_OPINION") 68 private String firstOpinion; 69 70 /** 71 * 選択肢イ 72 */ 73 @Column(name = "SECOND_OPINION") 74 private String secondOpinion; 75 76 /** 77 * 選択肢ウ 78 */ 79 @Column(name = "THIRD_OPINION") 80 private String thirdOpinion; 81 82 /** 83 * 選択肢エ 84 */ 85 @Column(name = "FOURTH_OPINION") 86 private String fourthOpinion; 87 88 /** 89 * 更新日時 90 */ 91 @Column(name = "UPDATED_AT", insertable = false, updatable = false) 92 private String updatedAt; 93 94 /** 95 * 登録日時 96 */ 97 @Column(name = "CREATED_AT", insertable = false) 98 private String createdAt; 99 100 /** 101 * 版 102 */ 103 @Version 104 @Column(name = "VERSION", insertable = false) 105 private int version; 106} 107

Java

1package com.koikeya.project1.domain.model; 2 3import java.io.Serializable; 4 5import javax.persistence.Column; 6import javax.persistence.Embeddable; 7 8import lombok.Data; 9 10/** 11 * 問題マスタ主キー定義クラス 12 * 13 * @author Yuki Koike 14 * 15 */ 16@Data 17@Embeddable 18public class QuestionPkc implements Serializable { 19 20 /** 21 * 年号 22 */ 23 @Column(name = "YEAR_NUMBER") 24 private String yearNumber; 25 26 /** 27 * 年 28 */ 29 @Column(name = "EXAMINATION_YEAR") 30 private String examinationYear; 31 32 /** 33 * 期 34 */ 35 @Column(name = "PERIOD") 36 private String period; 37 38 /** 39 * 時間区分 40 */ 41 @Column(name = "TIME_SEGMENT") 42 private String timeSegment; 43 44 /** 45 * 問題番号 46 */ 47 @Column(name = "QUESTION_NO") 48 private String questionNo; 49} 50

Java

1package com.koikeya.project1.domain.repository; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4import org.springframework.data.jpa.repository.Query; 5import org.springframework.data.repository.query.Param; 6 7import com.koikeya.project1.domain.model.Question; 8 9/** 10 * 問題リポジトリインタフェース 11 * 12 * @author Yuki Koike 13 */ 14public interface QuestionRepository extends JpaRepository<Question, String>{ 15 16 @Query("SELECT question FROM Question question WHERE question.yearNumber = :yearNumber AND" 17 + " question.examinationYear = :examinationYear AND question.period = :period AND" 18 + " question.timeSegment = :timeSegment AND question.questionNo = :questionNo") 19 Question findByCompositePrimaryKey( 20 @Param("yearNumber")String yearNumber, @Param("examinationYear")String examinationYear, 21 @Param("period")String period, @Param("timeSegment")String timeSegment, @Param("questionNo")String questionNo); 22 23} 24

投稿2020/02/27 16:52

yuki1111

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問