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

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

ただいまの
回答率

90.61%

  • Java

    13522questions

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

  • PostgreSQL

    1035questions

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

  • Spring Boot

    468questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 259

hide--

score 9

 前提・実現したいこと

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

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "mst_sensor")
public class Machine {

    private Integer sensorId;
    private String sensorName;
    private Timestamp updatedata;
    private MachineMailAdd machineMailAdd;

    @Id
    @Column(name="sensor_id")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sensorIdSeq")
    @SequenceGenerator(name="sensorIdSeq", sequenceName="mst_sensor_sensor_id_seq", allocationSize=1)
    public Integer getSensorId() {
        return sensorId;
    }

    public void setSensorId(Integer sensorId) {
        this.sensorId = sensorId;
    }

    @Column(name="sensor_name")
    @NotNull
    @Size(min = 1, max = 15)
    public String getSensorName() {
        return sensorName;
    }

    public void setSensorName(String sensorName) {
        this.sensorName = sensorName;
    }

    @Column(name="updatedata")
    public Timestamp getUpdatedata() {
        return updatedata;
    }

    public void setUpdatedata(Timestamp updatedata) {
        this.updatedata = updatedata;
    }

    @OneToOne(mappedBy = "machine", cascade = CascadeType.ALL)
    public MachineMailAdd getMachineMailAdd() {
        return machineMailAdd;
    }

    public void setMachineMailAdd(MachineMailAdd machineMailAdd) {
        this.machineMailAdd = machineMailAdd;
    }

}

MachineMailAdd.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "mst_mail")
public class MachineMailAdd {

    private Integer mailId;
    private Integer sendmailThreshold;
    private String sendmailAddress;
    private Timestamp updatedata = new Timestamp(System.currentTimeMillis());
    private Machine machine;

    @Id
    @Column(name="mail_id")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="mailIdSeq")
    @SequenceGenerator(name="mailIdSeq", sequenceName="mst_mail_mail_id_seq", allocationSize=1)
    public Integer getMailId() {
        return mailId;
    }

    public void setMailId(Integer mailId) {
        this.mailId = mailId;
    }

    @Column(name="sendmail_threshold")
    @NotNull
    public Integer getSendmailThreshold() {
        return sendmailThreshold;
    }

    public void setSendmailThreshold(Integer sendmailThreshold) {
        this.sendmailThreshold = sendmailThreshold;
    }

    @Column(name="sendmail_address")
    @Size(min = 1, max = 128)
    public String getSendmailAddress() {
        return sendmailAddress;
    }

    public void setSendmailAddress(String sendmailAddress) {
        this.sendmailAddress = sendmailAddress;
    }

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "sensor_id")
    public Machine getMachine() {
        return machine;
    }

    public void setMachine(Machine machine) {
        this.machine = machine;
    }

}

MachineController.java

    @RequestMapping("add")
    String create(Model model) {
        return "admin/machine/add";
    }

    @PostMapping(path = "add")
    String createAdd(@Validated Machine form, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return create(model);
        }
        Machine machine = new Machine();
        BeanUtils.copyProperties(form, machine);
        machine.setUpdatedata(new Timestamp(System.currentTimeMillis()));
        machineService.create(machine);

        return "redirect:/admin/machine/";
    }

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

Java
SpringBoot
PostgreSQL

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/05/25 08:36

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

    キャンセル

  • hide--

    2018/05/25 10:00

    回答の返信として詳細書いておりますので、ご確認ください。

    キャンセル

  • asahina1979

    2018/05/25 12:31

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

    キャンセル

  • hide--

    2018/05/25 14:11

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

    キャンセル

回答 2

check解決した方法

0

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

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

MachineController.java

@PostMapping(path = "add")
String createAdd(@Validated MachineMail form, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return create(model);
    }
    MachineMail machineMail = new MachineMail();
    BeanUtils.copyProperties(form, machineMail);
    machineMail.setUpdatedata(new Timestamp(System.currentTimeMillis()));
    machineMailService.create(machineMail);

    return "redirect:/admin/machine/";
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

create sequence LiquorID_seq;


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


を参考にされては?

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/25 09: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 12:28

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

    キャンセル

  • 2018/05/25 14:09

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    JAVAに関する質問

    JAVAに関する質問です。 JAVAで以下のプログラムを作成しました。 import java.util.Scanner;  public class Sample {  /

  • 解決済

    氏名(String 型)とデータ(int 型)の可変長配列の作成をしたい

    ≪やりたいコト≫ BufferedReaderで入力値を読み込んで 文字列が入力されたら名前としてList型に格納。 次にその入力された名前に紐付くデータ(int型)を複数入

  • 解決済

    ファイルの書き出し

    前提・実現したいこと csvファイルから読み込んだものをソートして別のcsvファイルに書き出しを行いたいです。 発生している問題・エラーメッセージ 書き出しが行われない。

  • 解決済

    Javaで人数を編集したい

    現在Javaで開発をしています。 ある項目の人数の編集をしたいのですがどのようなコードを書けばいいか困っています。 仕様は以下です。 1. checkがtrueの

  • 解決済

    jacksonを使ってWebAPIから取り出したJSONファイルをJavaオブジェクトにしたい

    jacksonを使ってWebAPIから取り出したJSONファイルをJavaオブジェクトにしたい Javaでe-Statという統計のWebAPIから値を取り出したいと考えています。

  • 解決済

    親サーブレットのロジックで子サーブレットのサーブレット名を取得

    【背景】 親サーブレットから遷移先に指定されているJSPで 呼び出し元(親サーブレットを継承し製造したサーブレット、以下子サーブレット)のサーブレット名を取得し、表示したいです

  • 解決済

    javaクラスの初歩的な質問

    下記の様な簡単な抽象クラスを作りました。 文字列に接頭語、接尾語を追加するクラスになります。 この例では、抽象関数doExecの戻り値は文字列型ですが、違う変数型でも返したい場

  • 解決済

    Java クラスの追加方法について(テトリス)

    Javaでテトリスの実装をさせているのですが機能として次にくるブロックを表示させる機能追加をしようとしていて別途でnextblockpaenlを作成したのですが(コード2)、コード

同じタグがついた質問を見る

  • Java

    13522questions

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

  • PostgreSQL

    1035questions

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

  • Spring Boot

    468questions

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

  • トップ
  • Javaに関する質問
  • SpringBootでOneToOneテーブル結合し自動生成したIDを結合先に登録したいがnullエラーとなる。