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

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

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

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

Q&A

解決済

1回答

6466閲覧

JPA @ManyToOne時の@JoinColumnのパラメータ、insertable = false,updatable = falseについて

rabi0615

総合スコア7

Spring

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

0グッド

0クリップ

投稿2018/02/17 08:38

よろしくお願いします。

SpringでJPA以下のようなプログラムを実行したのですが、結果が想定と異なります。ご教授いただけますでしょうか。

テーブル:w_m

x(PK) a 

テーブルw_n

a(PK)y

M.java

@Entity @Table(name = "w_m") public class M implements Serializable{ private static final long serialVersionUID = 1L; public M(){} @Id @Column private String x; @Column private String a; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(referencedColumnName = "a",name = "a", insertable = false,updatable = false) private N nn; //getter、setter

N,java

@Entity @Table(name = "w_n") public class N implements Serializable{ private static final long serialVersionUID = 1L; public N(){} @Id @Column private String a; @Column //カラム private String y;

ServiceImp.java

@Service public class ServiceImp { //エントリーマネージャーのインジェクション @PersistenceContext EntityManager entityManager; @Transactional public void createM(M m){ entityManager.persist(m); } }

Main.java

public static void main(String[] args) { //コンテキストからバインド @SuppressWarnings("resource") ApplicationContext context = new ClassPathXmlApplicationContext("./spring/application-config.xml"); ServiceImp bhs = context.getBean(ServiceImp.class); //データ登録 M cm = new M(); N cn = new N(); cm.setX("99999"); cm.setA("aaaaa"); cn.setA("aaaaa"); cn.setY("zzzzz"); cm.setNn(cn); //更新処理 bhs.createM(cm); }

結果としては、w_mとw_nに登録されました。


質問

@Many@Oneの際に@JoinColumnに追加しなければエラーとなる(と認識しています)「insertble」と「updateble」は、どういった意味のあるパラメータなのでしょうか。

私はw_mには更新(insert)されるが、w_nには更新されないものと思っていましたが、結果はすべてに更新が行われたことで、「insertable = false,updatable = false」の部分は"何がfalse"となるのか教えて頂けますでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@Column@JoinColumn 両方定義した場合にどっちから更新したらいいかわからないから参照のみの設定にしてください

ということ

設定値の意味

insertable = false はインサートしないデータ
updatable = false はアップデートしないデータ
insertable = true はインサートするデータ
updatable = true はアップデートするデータ

アノテーションの補足

users

columntype
idint
namevarchar(255)
role_idint
実装のケース
@Column int id @Column String name @Column(name="role_id") int roleId

@Column int id @Column String name @JoinColumn(name="role_id") Role role

は作成されたテーブルの構造(FK 除く)は同一になります。
なので

@Column int id @Column String name @Column int roleId @JoinColumn(name="role_id") Role role

と実装すると

CREATE TABLE users ( int id primary key name text, role_id int, role_id int )

の解釈になってしまうため、この項目は参照用だよって明示してあげる必要があります。

投稿2018/02/17 08:42

編集2018/02/17 10:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rabi0615

2018/02/17 09:22

早速のご回答ありがとうございます。 自分の技術力のなさを棚に上げて言うのは申し訳ないのですが、 なんとなく、言っている意味は分かる気がするのですが、すっきりしていません。 よろしければ、もう少し詳細にご説明していただくことは可能でしょうか? 【すっきりしないこと・・】 ・@Columnとは、どのクラスのどのカラムのことを指していますでしょうか。 ・どっちから更新すればいいか・・ということは、場合によっては@Columnを削除するような記述もあるという事でしょうか。
rabi0615

2018/02/18 02:27

詳細なご説明有難うございました。 ご説明の内容で「@Column int roleId」を削除した状態でも更新がされることも確認できました。質問の内容以外にもご認識していた部分があったことが分かり、大変助かりました。 有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問