teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

デバッグ後の結果

2019/03/16 13:20

投稿

sanezane
sanezane

スコア91

title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,12 @@
1
1
  ### やりたいこと
2
2
  ユーザ登録機能の作成。
3
3
  ###現状
4
- ユーザ登録時に作成者(created_by)などのシステム制御項目を挿入するようにしたいが、Domaによって自動生成されるInsert文created_by(作成者)などシステム制御項目が入ってこないためエラーで落ちる。
4
+ ユーザ登録時に作成者(created_by)などのシステム制御項目を挿入するようにしたいが、Insert文created_byのvalueにnullが入ってしまうためエラーで落ちる。
5
- (ユーザ情報を格納するテーブルで「created_by(作成者)」を必須項目に指定しているため)
5
+ (ユーザ情報を格納するテーブルで「created_by(作成者)」をnot nullに指定しているため)
6
+ created_byへ値を設定している(ハズ)の箇所は**DefaultEntityListener**というクラスです。ここで値が設定できていません。
7
+ 以下にコードを示していますが、**DefaultEntityListener**の`val createdBy = AuditInfoHolder.getAuditUser();`の部分で値が取得できていないことがわかりました。
6
8
  以下エラー画像(created_byは作成者)
7
- ![イメージ説明](74285fa9d6809a39f7e148bd775851a1.jpeg)
9
+ ![![イメージ説明](9ef1df0d1275e0e3145d2d157b6acbdf.jpeg)](6b70625fc1ce5fb824517be868c96086.jpeg)
8
10
 
9
11
  ###テーブル定義
10
12
 
@@ -34,49 +36,50 @@
34
36
  ```User
35
37
  package com.example.demo.domain.dto;
36
38
 
39
+ import com.example.demo.domain.dto.common.DomaDtoImpl;
37
40
  import lombok.Data;
38
41
  import org.seasar.doma.*;
39
42
 
40
43
  @Entity
41
44
  @Data
42
45
  @Table(name = "users")
43
- public class User extends DomaDto{
46
+ public class User extends DomaDtoImpl {
44
47
  //自動採番設定
45
48
  @Id
46
49
  @Column(name = "user_id")
47
50
  @GeneratedValue(strategy= GenerationType.IDENTITY)
48
- private Long id;
51
+ Long id;
49
52
 
50
53
  @Column
51
- private String name;
54
+ String name;
52
55
 
53
56
  @Column
54
- private String email;
57
+ String email;
55
58
 
56
59
  @Column
57
- private String password;
60
+ String password;
58
61
 
59
62
  }
60
63
 
64
+
61
65
  ```
62
66
 
63
67
  DomaDto.javaではシステム制御項目を定義している。また、自動的に更新するようにDefaultEntityListener.javaを作成し指定している。
64
- ```DomaDto
68
+ ```DomaDtoImpl
65
- package com.example.demo.domain.dto;
69
+ package com.example.demo.domain.dto.common;
66
70
 
67
71
  import com.fasterxml.jackson.annotation.JsonIgnore;
68
72
  import lombok.Data;
69
73
  import org.seasar.doma.Column;
70
74
  import org.seasar.doma.Entity;
75
+ import org.seasar.doma.Version;
71
76
 
72
77
  import java.io.Serializable;
73
- import java.time.LocalDate;
74
78
  import java.time.LocalDateTime;
75
- import java.util.Date;
76
79
 
77
80
  @Entity(listener = DefaultEntityListener.class)// 自動的にシステム制御項目を更新するためにリスナーを指定する
78
81
  @Data
79
- public class DomaDto implements Serializable {
82
+ public abstract class DomaDtoImpl implements DomaDto,Serializable {
80
83
 
81
84
  // 作成者
82
85
  @JsonIgnore
@@ -108,10 +111,11 @@
108
111
  @Column
109
112
  private LocalDateTime deleted_at;
110
113
 
111
- //バージョン
114
+ // 楽観的排他制御で使用する改定番号
115
+ @Version
116
+ @Column(name = "version")
112
117
  @JsonIgnore
113
- @Column
114
- private int version;
118
+ Integer version;
115
119
 
116
120
  }
117
121
 
@@ -120,10 +124,9 @@
120
124
 
121
125
  ```DefaultEntityListener
122
126
 
123
- package com.example.demo.domain.dto;
127
+ package com.example.demo.domain.dto.common;
124
128
 
125
129
  import com.example.demo.common.utils.ReflectionUtils;
126
- import com.example.demo.domain.dto.DomaDto;
127
130
  import com.example.demo.domain.exception.DoubleSubmitErrorException;
128
131
  import lombok.NoArgsConstructor;
129
132
  import lombok.extern.slf4j.Slf4j;