[JAVA] Ein Memo über den Fall, dass das Einfügen mit Spring Data JDBC nicht durchgeführt werden konnte

Ich war süchtig nach Spring Data JDBC, das ich irgendwie überprüfte, also machte ich mir eine Notiz. (Der Base Spring Boot ist etwas alt, aber ...)

Umgebung

Was ich versucht habe zu tun

Ich habe gerade versucht, ein Objekt mit Spring Data JDBC in eine Tabelle einzufügen

Ursache der Sucht

Anscheinend gibt Spring Data JDBC SQL aus, wenn das Feld mit @ID ein Objekttyp ist, Einfügen, wenn es null ist, und Aktualisieren, wenn es nicht null ist. Dies bedeutet, dass die PK der Tabelle automatisch generiert werden muss.

Referenz https://stackoverflow.com/questions/50371775/why-does-spring-data-jdbc-not-save-my-car-object

Versuchen Sie, mit Beispielcode zu arbeiten

Objekt

Users.java


public class Users {
  @Id
  private Integer user_id;
  private String password;
  private String notes;

Bedienung

SampleService.java


@Transactional
@Service
public class SampleService {
  @Autowired
  private UserRepository dao;
//Abkürzung
//Es ist ein sehr grober Code ...
  public void add(Integer id) {
    LocalDateTime time = LocalDateTime.now();
    Users user = new Users(id, "password", time.toString());
    logger.info(user.toString());
    Users inserted = dao.save(user);
  }

Zur Testausführung

SampleServiceTest.java


@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleServiceTest {
  
  @Autowired
  private SampleService service;
  
//Aktualisieren Sie, wenn Sie dies ausführen
  @Test
  public void test1() {
    service.add(3);
  }
  
//Wenn Sie dies ausführen, fügen Sie ein
  @Test
  public void test2() {
    service.add(null);
  }
}

Wenn test1 () ausgeführt wird

2019-11-19 18:41:47.275  INFO 37316 --- [           main] org.example.test.service.SampleService   : userid: 3, note: 2019-11-19T18:41:47.274

Postgre SQL-Trace zu diesem Zeitpunkt

2019-11-19 09:41:47.326 UTC [167] LOG:  execute <unnamed>: BEGIN
2019-11-19 09:41:47.334 UTC [167] LOG:  execute <unnamed>: UPDATE users SET user_id = $1, password = $2, notes = $3 WHERE user_id = $4
2019-11-19 09:41:47.334 UTC [167] DETAIL:  parameters: $1 = '3', $2 = 'password', $3 = '2019-11-19T18:41:47.274', $4 = '3'

Wenn test2 () ausgeführt wird

2019-11-19 18:41:47.355  INFO 37316 --- [           main] org.example.test.service.SampleService   : userid: null, note: 2019-11-19T18:41:47.355

Postgre SQL-Trace zu diesem Zeitpunkt

2019-11-19 09:41:47.368 UTC [167] LOG:  execute <unnamed>: BEGIN
2019-11-19 09:41:47.368 UTC [167] LOG:  execute <unnamed>: INSERT INTO users (password, notes) VALUES ($1, $2)
	RETURNING *
2019-11-19 09:41:47.368 UTC [167] DETAIL:  parameters: $1 = 'password', $2 = '2019-11-19T18:41:47.355'

schließlich

Lassen Sie uns vorerst die DDL ändern und die Version von Spring Boot erhöhen. Mit Postgres 10 können Sie es automatisch generieren. https://qiita.com/nuko_yokohama/items/7d0d5525bcefaa3332ce

Oh, ich habe hier auf die SQL-Trace-Einstellungen von PostgreSQL verwiesen. https://www.kakiro-web.com/postgresql/postgresql-sql-log-system.html

Recommended Posts

Ein Memo über den Fall, dass das Einfügen mit Spring Data JDBC nicht durchgeführt werden konnte
Bitte beachten Sie, dass Spring Boot + Tomcat 8.5.8 nicht verwendet werden kann!
Kompatibilität von Spring JDBC und My Batis mit Spring Data JDBC (vorläufig)
Das Problem, dass der Test nicht über die Befehlszeile mit Spring-Boot-Starter-Test ausgeführt werden konnte, wurde behoben
Spring Data JDBC-Vorschau
Die Geschichte, dass das erzwungene Update nicht implementiert werden konnte
Die Geschichte, dass der Anforderungsparameter aus der iPhone-Anwendung mit dem Servlet nicht erfolgreich abgerufen werden konnte
Problem, dass die Garninstallation nicht über das von Azure DevOps erstellte npm-Repository durchgeführt werden konnte
Der Fall, dass @Autowired in JUnit5 nicht verwendet werden konnte
Verwenden Sie Spring JDBC mit Spring Boot
Die Geschichte des Anhaltens, weil der Schienentest nicht durchgeführt werden konnte
Entspricht "Fehler, dass die Basisauthentifizierung nicht bestanden wird" im Testcode "Die Geschichte, die nicht gemacht werden konnte".
Der Fall, in dem das in der "Docker-Datei" definierte "apt-get update" während des "Docker-Compose-Builds" nicht ausgeführt werden konnte.
Hinweise zur Verwendung von Spring Data JDBC
Einstellungen, die beim Betrieb einer Produktionsumgebung mit Rails vorgenommen werden sollten
Die Geschichte, dass das Servlet nicht in die Java-Webanwendung geladen werden konnte
JSESSIONID konnte bei Verwendung von Spring Security nicht der URL zugewiesen werden