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

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

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

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

Java

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

Spring

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Spring Boot

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

Q&A

解決済

1回答

1610閲覧

Spring Data JPAでエンティティクラスに別のエンティティクラスを格納する方法

mitsusawa

総合スコア28

Hibernate

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

Java

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

Spring

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Spring Boot

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

0グッド

0クリップ

投稿2018/07/16 08:43

編集2018/07/16 15:57

現在Spring Bootを用いて、簡単なWebアプリを習作として制作中です。
環境はSpring Boot 2.0.3, JDK 10, MariaDB, Tomcat 9といったもので、IDEはIntellij IDEAを使用しています。


質問なのですが、現在エンティティクラスAにエンティティクラスBのListを格納し、BにはエンティティクラスCのListを格納、それらのデータベース操作をJPAで実現しようとしています。具体的に格納したいものは、

A.java

1@Entity 2@Table 3@Embeddable 4public class A implements Serializable { 5 @Id 6 @GeneratedValue(strategy = GenerationType.AUTO) 7 @Column(nullable = false, unique = true) 8 @NotNull 9 private Long id; 10 @OneToMany(targetEntity = B.class, cascade = CascadeType.ALL) 11 @Embedded 12 private List<B> b; 13 14 //Getter, Setter略 15}

B.java

1@Entity 2@Table 3@Embeddable 4public class B implements Serializable { 5 @Id 6 @GeneratedValue(strategy = GenerationType.AUTO) 7 @Column(nullable = false, unique = true) 8 @NotNull 9 private Long id; 10 @ManyToOne 11 @JoinColumn 12 private A a; 13 14 @OneToMany(targetEntity = C.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL) 15 @PrimaryKeyJoinColumn 16 @Embedded 17 private List<C> c; 18 19 //Getter, Setter略 20}

C.java

1@Entity 2@Table 3@Embeddable 4public class C implements Serializable { 5 @Id 6 @GeneratedValue(strategy = GenerationType.AUTO) 7 @Column(nullable = false, unique = true) 8 @NotNull 9 private Long id; 10 @ManyToOne 11 @JoinColumn 12 private B b; 13 14 @ManyToOne 15 @JoinColumn 16 private A a; 17 18 //Getter, Setter略 19}

といったデータ構造です。しかし、これを実行すると

result

1Error accessing field [private java.lang.Long com.product.hoge.Data.C.id] by reflection for persistent property [com.product.hoge.Data.C#id] : [Lcom.product.hoge.Data.C;@7d09686f; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Long com.product.hoge.Data.C.id] by reflection for persistent property [com.product.hoge.Data.C#id] : [Lcom.product.hoge.Data.C;@7d09686f

といったような例外が発生してしまいます。また、コンソールには

console

1java.lang.IllegalArgumentException: Can not set java.lang.Long field com.product.hoge.Data.C.id to [Lcom.product.hoge.Data.C;

という出力がなされています。

解決を試みてここ数日粘っていたのですが、糸口さえつかめていません。
よろしくお願いします。

// 追記
コントローラについて書いていませんでしたが、それぞれのレポジトリから、Cをそれぞれsave、Bをsave、AをsaveAndFlushした場合にこの状況が発生します。

// 追記2: 経緯
当初ElementCollectionの利用を試みて失敗し、OneToManyの利用に切り替えたもののやはり芳しく無く、エラー回避のため色々と調べて弄ったところ異様なコード・設定になってしまったようです。当初参考にしたサイトは、ここで、その後断片的な情報を集めてごちゃまぜにしてしまいこうなってしまった次第です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/16 15:42

こんな頓珍漢な設定をした元を追記してください
guest

回答1

0

自己解決

自己解決しました。
二重リスト構造をそのまま格納することは出来ず、内側リストを保持するエンティティクラスを作成することで@OneToManyアノテーションを用いて格納が可能になりました。

A.java

1@Entity 2public class A implements Serializable, Cloneable { 3 @Id 4 @GeneratedValue(strategy = GenerationType.AUTO) 5 @Column(nullable = false, unique = true) 6 @NotNull 7 private Long id; 8 @OneToMany(targetEntity = B.class, cascade = CascadeType.ALL) 9 @Column(nullable = false) 10 @OrderBy 11 private List<B> b; 12 13 //Getter, Setter略 14}

B.java

1@Entity 2public class B implements Serializable, Cloneable { 3 @Id 4 @GeneratedValue(strategy = GenerationType.AUTO) 5 @Column(nullable = false, unique = true) 6 @NotNull 7 private Long id; 8 @OneToMany(targetEntity = CWrap.class, cascade = CascadeType.ALL) 9 @OrderBy 10 private List<CWrap> cWrap; 11 @ManyToOne(targetEntity = A.class) 12 private A a; 13 14 //Getter, Setter略 15}

CWrap.java

1@Entity 2public class CWrap implements Serializable, Cloneable { 3 @Id 4 @GeneratedValue(strategy = GenerationType.AUTO) 5 @Column(nullable = false, unique = true) 6 @NotNull 7 private Long id; 8 @OneToMany(targetEntity = C.class, cascade = CascadeType.ALL) 9 @OrderBy 10 private List<C> c; 11 @ManyToOne(targetEntity = B.class) 12 private B b; 13 14 //Getter, Setter略 15}

C.java

1@Entity 2public class C implements Serializable, Cloneable { 3 @Id 4 @GeneratedValue(strategy = GenerationType.AUTO) 5 @Column(nullable = false, unique = true) 6 @NotNull 7 private Long id; 8 @ManyToOne(targetEntity = CWrap.class) 9 private CWrap cWrap; 10 11 //Getter, Setter略 12}

投稿2018/07/28 04:54

編集2018/07/28 04:56
mitsusawa

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問