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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring Boot

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

Q&A

解決済

2回答

3991閲覧

SpringBootでOneToOneテーブル結合し自動生成したIDを結合先に登録したいがnullエラーとなる。

hide--

総合スコア15

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2018/05/24 14:42

編集2018/05/25 05:09

前提・実現したいこと

SpringBootの勉強中です。
1つのフォームで、2つのテーブルの内容を登録したくて、OneToOne結合しています。
主のテーブルの自動採番(mst_sensorのsensor_id、mst_mailのmail_id)はinsert文に表示されていますが、その採番されたID(sensor_id)を結合先のテーブル(mst_mail)に登録したいのですが、nullとなり登録できずに困っています。
よろしくお願いします。

発生している問題・エラーメッセージ

10. insert into mst_sensor (sensor_name, updatedata, sensor_id) values ('AA11', '05/25/2018 09:54:22.253', 36) {executed in 66 msec} 10. insert into mst_mail (sensor_id, sendmail_address, sendmail_threshold, updatedata, mail_id) values (NULL, NULL, 1, '05/25/2018 09:54:22.047', 11) {FAILED after 47 msec} org.postgresql.util.PSQLException: ERROR: null value in column "sensor_id" violates not-null constraint 詳細: Failing row contains (null, 0, 1, null, 2018-05-25 09:54:22.047, 11).

該当のソースコード

postgresql

\d mst_sensor Table "public.mst_sensor" Column | Type | Collation | Nullable | Default -------+------+-----------+----------+-------------------- sensor_id | integer | | not null | nextval('mst_sensor_sensor_id_seq'::regclass) sensor_name | character varying(30) | | not null | updatedata | timestamp without time zone | | not null | Indexes: "mst_sensor_pkey" PRIMARY KEY, btree (sensor_id) \d mst_sensor_sensor_id_seq Sequence "public.mst_sensor_sensor_id_seq" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache -----+-------+---------+---------+-----------+---------+------- integer | 1 | 1 | 2147483647 | 1 | no | 1 Owned by: public.mst_sensor.sensor_id \d mst_mail Table "public.mst_mail" Column | Type | Collation | Nullable | Default -------+------+-----------+----------+----------------------- sensor_id | integer | | not null | sendmail_threshold | integer | | | sendmail_address | character varying(128) | | | updatedata | timestamp without time zone | | not null | mail_id | integer | | not null | nextval('mst_mail_mail_id_seq'::regclass) Indexes: "mst_mail_pkey" PRIMARY KEY, btree (mail_id) \d mst_mail_mail_id_seq Sequence "public.mst_mail_mail_id_seq" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache -----+-------+---------+---------+-----------+---------+------- bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1

Machine.java

java

1@Data 2@NoArgsConstructor 3@AllArgsConstructor 4@Entity 5@Table(name = "mst_sensor") 6public class Machine { 7 8 private Integer sensorId; 9 private String sensorName; 10 private Timestamp updatedata; 11 private MachineMailAdd machineMailAdd; 12 13 @Id 14 @Column(name="sensor_id") 15 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sensorIdSeq") 16 @SequenceGenerator(name="sensorIdSeq", sequenceName="mst_sensor_sensor_id_seq", allocationSize=1) 17 public Integer getSensorId() { 18 return sensorId; 19 } 20 21 public void setSensorId(Integer sensorId) { 22 this.sensorId = sensorId; 23 } 24 25 @Column(name="sensor_name") 26 @NotNull 27 @Size(min = 1, max = 15) 28 public String getSensorName() { 29 return sensorName; 30 } 31 32 public void setSensorName(String sensorName) { 33 this.sensorName = sensorName; 34 } 35 36 @Column(name="updatedata") 37 public Timestamp getUpdatedata() { 38 return updatedata; 39 } 40 41 public void setUpdatedata(Timestamp updatedata) { 42 this.updatedata = updatedata; 43 } 44 45 @OneToOne(mappedBy = "machine", cascade = CascadeType.ALL) 46 public MachineMailAdd getMachineMailAdd() { 47 return machineMailAdd; 48 } 49 50 public void setMachineMailAdd(MachineMailAdd machineMailAdd) { 51 this.machineMailAdd = machineMailAdd; 52 } 53 54}

MachineMailAdd.java

java

1@Data 2@NoArgsConstructor 3@AllArgsConstructor 4@Entity 5@Table(name = "mst_mail") 6public class MachineMailAdd { 7 8 private Integer mailId; 9 private Integer sendmailThreshold; 10 private String sendmailAddress; 11 private Timestamp updatedata = new Timestamp(System.currentTimeMillis()); 12 private Machine machine; 13 14 @Id 15 @Column(name="mail_id") 16 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="mailIdSeq") 17 @SequenceGenerator(name="mailIdSeq", sequenceName="mst_mail_mail_id_seq", allocationSize=1) 18 public Integer getMailId() { 19 return mailId; 20 } 21 22 public void setMailId(Integer mailId) { 23 this.mailId = mailId; 24 } 25 26 @Column(name="sendmail_threshold") 27 @NotNull 28 public Integer getSendmailThreshold() { 29 return sendmailThreshold; 30 } 31 32 public void setSendmailThreshold(Integer sendmailThreshold) { 33 this.sendmailThreshold = sendmailThreshold; 34 } 35 36 @Column(name="sendmail_address") 37 @Size(min = 1, max = 128) 38 public String getSendmailAddress() { 39 return sendmailAddress; 40 } 41 42 public void setSendmailAddress(String sendmailAddress) { 43 this.sendmailAddress = sendmailAddress; 44 } 45 46 @OneToOne(cascade = CascadeType.ALL) 47 @JoinColumn(name = "sensor_id") 48 public Machine getMachine() { 49 return machine; 50 } 51 52 public void setMachine(Machine machine) { 53 this.machine = machine; 54 } 55 56}

MachineController.java

java

1 @RequestMapping("add") 2 String create(Model model) { 3 return "admin/machine/add"; 4 } 5 6 @PostMapping(path = "add") 7 String createAdd(@Validated Machine form, BindingResult result, Model model) { 8 if (result.hasErrors()) { 9 return create(model); 10 } 11 Machine machine = new Machine(); 12 BeanUtils.copyProperties(form, machine); 13 machine.setUpdatedata(new Timestamp(System.currentTimeMillis())); 14 machineService.create(machine); 15 16 return "redirect:/admin/machine/"; 17 }

補足情報(FW/ツールのバージョンなど)

Java
SpringBoot
PostgreSQL

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/24 23:36

シーケンスがないのでは?
hide--

2018/05/25 01:00

回答の返信として詳細書いておりますので、ご確認ください。
退会済みユーザー

退会済みユーザー

2018/05/25 03:31

そもそも 上記サンプルソースでは new MachineMailAdd + SET がないので MachineMailAdd に対して INSERT は動かないはずですよ
hide--

2018/05/25 05:11

ログを追記しましたが、両テーブルinsertが発行され、machineMailAddのinsertでエラーが出ている状況です。エンティティで結合しているのでこれで出来るかと思っていましたが、間違えているでしょうか?
guest

回答2

0

自己解決

自己解決しました。
連絡するカラム(sensor_id)を採番するテーブル(mst_sensor)ではなく、
参照して登録するテーブル(mst_mail)をコントローラーで保存する形に変更することで、
実現することができました。

ありがとうございました。

MachineController.java

java

1@PostMapping(path = "add") 2String createAdd(@Validated MachineMail form, BindingResult result, Model model) { 3 if (result.hasErrors()) { 4 return create(model); 5 } 6 MachineMail machineMail = new MachineMail(); 7 BeanUtils.copyProperties(form, machineMail); 8 machineMail.setUpdatedata(new Timestamp(System.currentTimeMillis())); 9 machineMailService.create(machineMail); 10 11 return "redirect:/admin/machine/"; 12}

投稿2018/05/26 23:48

hide--

総合スコア15

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

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

0

質問のマナーとして、CREATE TABLEとCREATE SEQUENCE を質問に載せてください。

PostgreSQL で連番の数字のフィールドを作る方法 (sequence について)

SQL

1create sequence LiquorID_seq;

SQL

1insert into LiquorList (LiquorID, LiquorName, LiquorDate) 2values (nextval('LiquorID_seq'), 'ビール', '2007-12-01');

を参考にされては?

追記
どこの掲示板でも同じことですが、自分で質問する前に他の人の質問を何件か読んで質問の書き方を学びます。
最初の質問にCREATE TABLE を載せましょう。テーブルの定義がないとINSERTは実行できません。
PostgreSQL CREATE TABLE文取得方法

ALTER SEQUENCE でSEQUENCEの初期値を変更できます。

ここまで書けば後は自分で直せますか?

投稿2018/05/25 00:37

編集2018/05/25 02:00
Orlofsky

総合スコア16415

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

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

hide--

2018/05/25 00:58

はじめて質問するもので、見やすくするにはどこにどう入れたらいいか分からずすみません。 それぞれ、mst_sensorとmst_mailのシーケンスを設定していてSQLのログ上は出ています。 10. insert into mst_sensor (sensor_name, updatedata, sensor_id) values ('AA11', '05/25/2018 09:54:22.253', 36) 10. insert into mst_mail (sensor_id, sendmail_address, sendmail_threshold, updatedata, mail_id) values (NULL, NULL, 1, '05/25/2018 09:54:22.047', 11) この二つ目のmst_mailのinsert文にあるsensor_idに、一つ目のsensor_id「36」が入ってほしいのです。 \d mst_sensor Table "public.mst_sensor" Column | Type | Collation | Nullable | Default ---------------------+-----------------------------+-----------+----------+----------------------------------------------- sensor_id | integer | | not null | nextval('mst_sensor_sensor_id_seq'::regclass) sensor_name | character varying(30) | | not null | updatedata | timestamp without time zone | | not null | Indexes: "mst_sensor_pkey" PRIMARY KEY, btree (sensor_id) \d mst_sensor_sensor_id_seq Sequence "public.mst_sensor_sensor_id_seq" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ---------+-------+---------+------------+-----------+---------+------- integer | 1 | 1 | 2147483647 | 1 | no | 1 Owned by: public.mst_sensor.sensor_id \d mst_mail Table "public.mst_mail" Column | Type | Collation | Nullable | Default --------------------+-----------------------------+-----------+----------+------------------------------------------- sensor_id | integer | | not null | sendmail_threshold | integer | | | sendmail_address | character varying(128) | | | updatedata | timestamp without time zone | | not null | mail_id | integer | | not null | nextval('mst_mail_mail_id_seq'::regclass) Indexes: "mst_mail_pkey" PRIMARY KEY, btree (mail_id) \d mst_mail_mail_id_seq Sequence "public.mst_mail_mail_id_seq" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache --------+-------+---------+---------------------+-----------+---------+------- bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
退会済みユーザー

退会済みユーザー

2018/05/25 03:28

この手のは出力は質問を編集して追記してください。
hide--

2018/05/25 05:09

ありがとうございます。追記してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問