[JAVA] Notez que Spring Data JDBC n'a pas pu insérer

J'étais accro à Spring Data JDBC, que je révisais d'une manière ou d'une autre, alors j'ai pris une note. (La botte Spring de base est un peu vieille, mais ...)

environnement

Ce que j'ai essayé de faire

J'ai juste essayé d'insérer un objet dans une table avec Spring Data JDBC

Cause de la dépendance

Apparemment, Spring Data JDBC émet SQL lorsque le champ avec @ID est un type d'objet, Insérer lorsqu'il est nul et se mettre à jour lorsqu'il n'est pas nul. Le PK de la table doit être généré automatiquement.

référence https://stackoverflow.com/questions/50371775/why-does-spring-data-jdbc-not-save-my-car-object

Essayez d'exécuter avec un exemple de code

objet

Users.java


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

un service

SampleService.java


@Transactional
@Service
public class SampleService {
  @Autowired
  private UserRepository dao;
//Abréviation
//C'est un code très grossier ...
  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);
  }

Pour l'exécution des tests

SampleServiceTest.java


@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleServiceTest {
  
  @Autowired
  private SampleService service;
  
//Mettre à jour lorsque vous exécutez ceci
  @Test
  public void test1() {
    service.add(3);
  }
  
//Lorsque vous exécutez ceci, insérez
  @Test
  public void test2() {
    service.add(null);
  }
}

Lorsque test1 () est exécuté

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

Trace SQL Postgre à ce moment

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'

Lorsque test2 () est exécuté

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

Trace SQL Postgre à ce moment

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'

à la fin

Pour le moment, changeons le DDL et augmentons la version de Spring Boot. Avec Postgres 10, vous pouvez le créer automatiquement. https://qiita.com/nuko_yokohama/items/7d0d5525bcefaa3332ce

Oh, je me suis référé ici pour les paramètres de trace SQL de PostgreSQL. https://www.kakiro-web.com/postgresql/postgresql-sql-log-system.html

Recommended Posts

Notez que Spring Data JDBC n'a pas pu insérer
Veuillez noter que Spring Boot + Tomcat 8.5.8 ne peut pas être utilisé!
Compatibilité de Spring JDBC et My Batis avec Spring Data JDBC (provisoire)
Aperçu de Spring Data JDBC
L'histoire selon laquelle la mise à jour forcée n'a pas pu être mise en œuvre
L'histoire selon laquelle le paramètre de requête de l'application iPhone n'a pas pu être obtenu avec le servlet
Problème selon lequel l'installation de yarn n'a pas pu être effectuée à partir du référentiel npm créé par Azure DevOps
Le cas où @Autowired n'a pas pu être utilisé dans JUnit5
Utiliser Spring JDBC avec Spring Boot
L'histoire de l'arrêt parce que le test des rails n'a pas pu être fait
Correspondant à "erreur que l'authentification de base ne réussit pas" dans le code de test "L'histoire qui n'a pas pu être faite"
Le cas où "apt-get update" défini dans "Dockerfile" n'a pas pu être exécuté au moment de "docker-compose build"
Remarques sur l'utilisation de Spring Data JDBC
Paramètres à définir lors de l'exploitation d'un environnement de production avec Rails
L'histoire selon laquelle le servlet n'a pas pu être chargé dans l'application Web Java
JSESSIONID n'a pas pu être attribué à l'URL lors de l'utilisation de Spring Security