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

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

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

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

Java

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

Spring

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

17246閲覧

【Spring Boot】【JPA】テーブル結合が上手くいかない

退会済みユーザー

退会済みユーザー

総合スコア0

Hibernate

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

Java

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

Spring

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

0クリップ

投稿2015/12/21 12:59

編集2015/12/22 00:39

###前提・実現したいこと
下記のようなjoinをjpaで実現したいです。

sql

1select p.parent_name, c.* from Parent p inner join Child c on p.parent_id= c.parent_id;

###entity情報
一部実際の実装に近い形に修正しました 12/22 09:37

java

1@Table(name = "parent_table") 2@Entity 3public class Parent implements Serializable { 4 private static final long serialVersionUID = 8058371942878604902L; 5 @EmbeddedId 6 private ParentKey parentKey = new parentKey(); 7 @Column(name = "parent_name") 8 private String parentName; 9 @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 10 @JoinColumn(name = "parent_id", referencedColumnName = "parent_id") 11 @NotFound(action=NotFoundAction.IGNORE) 12 private List<Child> childList; 13 14 /** getter,setter省略 **/ 15 16 public static class ParentKey implements Serializable { 17 private static final long serialVersionUID = -795173904285910114L; 18 @Column(name = "hoge_id") 19 String hogeId; 20 @Column(name = "parent_id") 21 String parentId; 22 } 23 24 /** equals,hashCode省略 **/ 25} 26 27@Table(name = "child_table") 28@Entity 29public class Child implements Serializable { 30 private static final long serialVersionUID = 1718966005562173513L; 31 @EmbeddedId 32 private ChildKey childKey = new childKey(); 33 @Column(name = "child_name") 34 private String childName; 35 @ManyToOne 36 @JoinColumn(name = "parent_id", referencedColumnName = "parent_id") 37 private Parent parent; 38 39 /** getter,setter省略 **/ 40 41 public static class ChildKey implements Serializable { 42 private static final long serialVersionUID = -3848325403357861609L; 43 @Column(name = "child_id") 44 String childId; 45 @Column(name = "parent_id") 46 String parentId; 47 } 48 49 /** equals,hashCode省略 **/ 50}

###発生している問題・エラーメッセージ
上記の状態で、起動すると下記のエラーが出ます。

Caused by: org.hibernate.AnnotationException: referencedColumnNames(parent_id) of xx.xx.xxx.Child.parent referencing xx.xx.xxx.Parent not mapped to a single property

もう二日くらい悩んでおります・・・
やっぱJPAやめようかな

###補足情報(言語/FW/ツール等のバージョンなど)
必要そうなものだけ
java8
spring boot 1.3.0.RELEASE
spring-data-jpa-1.9.1.RELEASE
hibernate-jpa-2.1-api-1.0.0.Final

ikuwow👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/12/22 02:07 編集

修正ありがとうございます。ただ、まだ疑問点が残りましたので記載します。 【1】ParentのPKは(hoge_id,parent_id)の複合キーとなっていますが、書かれているSQL文のJOINの条件はparent_idのみです。@OneToManyアノテーションがついていますが、実際にはmany-to-manyということでしょうか。 【2】Childの複合PKも(child_id, parent_id)となっており、many-to-manyを示唆しています(many-to-oneであればhoge_idも必要であるはず)。あるいは、parent_idが単独でユニークになるのであればmany-to-oneは成立します、が、その場合ParentのPKは(parent_id)のみということになります。どちらが正しいでしょうか。////質問文をそのまま解釈すると、JPAの問題以前の、FK設計(あるいはPK設計)に問題があるように見えます。該当エラーメッセージは、複数カラムを使用するJOINに対しては@JoinColumns(最後のsに注意)を使用しなければならない、というエラーですが、本質はそこではありません。
退会済みユーザー

退会済みユーザー

2015/12/22 02:05

parent_idのみでのjoinがしたいので、@ManyToManyになるが正しいです。なるほど、アノテーションの付け方が誤っていたのですね。
退会済みユーザー

退会済みユーザー

2015/12/22 02:17 編集

すみません、書き方が悪かったですが、「parent_idのみでのjoinがしたい」のであればmany-to-manyにすべきだ、と言っているわけではなく、本来はどっちなのだろうか、というのがコードからは分からないということです。ParentがListでChildを持っており、他方、Childがparentフィールドで1インスタンスのみをもつようなクラス設計にしているということはone-to-manyなのだろうという想像はつく(し、それが一般的)のですが、テーブル設計がそうなっているようには見えない、のでどっちが正しいのだろう、と。本当にmany-to-manyが正しいのであれば、JPAアノテーションの問題のみならず、クラス設計から間違っています(ChildもListでParentを持たなければならないかと)。
退会済みユーザー

退会済みユーザー

2015/12/22 02:36

テーブル設計が正しいようですので、many-to-manyが正しいです。 大変お恥ずかしいですが、yukihaneさんの仰る通りクラス設計が誤っていました。
guest

回答2

0

ベストアンサー

@JoinColumn(name = "parent_id", referencedColumnName = "parent_id")

ここで問題あるかと思います。

参考:
http://stackoverflow.com/questions/21536095/org-hibernate-annotationexception-referencedcolumnnames-referencing-not-mapped

cause:
The cause of the issue is that you are trying to use a single join column, while the identity of the referenced entity is defined by multiple columns. You simply have to define all the needed join colums and you are good to go:

google翻訳:
問題の原因は、参照エンティティのアイデンティティが複数の列で定義されているときに、単一の結合列を使用しようとしているということです。あなたは、単にすべての参加に必要なcolumsを定義する必要があり、あなたが行ってもいいです。(なんとなくわかる)

投稿2015/12/22 05:25

liguofeng29

総合スコア801

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

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

退会済みユーザー

退会済みユーザー

2015/12/22 07:05

ご回答ありがとうございます。 「情報の追加・修正の依頼」でのyukihaneさんとのやりとりの結果、クラス設計のミスということになりました。 one-to-manyしたいのであれば、oneに当たるテーブルのPKをJoinColumnに全て指定しなければならないということですね。 ありがとうございます。
guest

0

解決はしてないんですが
「情報の追加・修正の依頼」でのyukihaneさんとの会話の結果、そもそもクラス設計が間違っていたようです。実際にはテーブル設計も微妙なんですが、いまさらどうこう出来るものでもないのでそれは置いておきます。
とりあえず、似たようなことがやりたくてココにたどり着いちゃった人は

one-to-manyで結合したければ、oneにあたるクラスのPKは全てjoinに含めましょう!含めれない場合は、クラス設計のミスかテーブル設計がおかしい場合があるっぽい?
many-to-oneも一緒
many-to-manyはよくわかりません。中間テーブルがいるっぽいけど、このPJは中間テーブルないんだよなー

投稿2015/12/22 10:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問