sourcetip

Spring Boot + JPA + Hibernate는 repository.save 시 커밋되지 않습니다.

fileupload 2023. 8. 11. 22:32
반응형

Spring Boot + JPA + Hibernate는 repository.save 시 커밋되지 않습니다.

MySQL에 Spring Boot Application + JPA가 있습니다.내 컨트롤러에서 엔티티를 게시할 때 repository.save에 호출할 수 있으며 "생성/업데이트된" 개체를 반환합니다.

하지만 데이터베이스를 보면 객체가 업데이트되지 않은 것을 알 수 있습니다.

여기 제 지원서가 있습니다.yml:

spring:
  jpa:
    show-sql: true
    generate-ddl: false
    hibernate:
      ddl-auto: none
    properties:
      hibernate.dialect: org.hibernate.dialect.MySQLDialect
      org.hibernate.envers.store_data_at_delete: true
      org.hibernate.envers.global_with_modified_flag: true
      org.hibernate.envers.track_entities_changed_in_revision: true
  datasource:
    initialize: false
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:databaseName}?createDatabaseIfNotExist=true
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:root}
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      minimumIdle: 20
      maximumPoolSize: 30
      idleTimeout: 5000
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048

제가 또 뭘 해야 하는지 아세요?

이것은 내 컨트롤러입니다.

@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public MyEntity saveMyEntity(@Valid @RequestBody final MyEntity myEntity) {
    Assert.notNull(myEntity, "The entry cannot be null");
    return myEntityService.save(myEntity);
}

및 MyEntity 서비스:

@Override
@UserCanCud
public Entity save(final Entity entity) {
    Assert.notNull(entity);
    final Entity savedEntity = repository.save(entity);
    return savedEntity;
}

제 (제한된) 경험상 이러한 유형의 문제는 스프링과 관련된 배후에서 일어나는 마법 때문에 디버깅하기가 조금 더 어렵지만, 유사한 문제를 해결하는 데 도움이 되는 조언을 해드리겠습니다. 이것이 여러분에게 필요한 정보를 제공하기를 바랍니다.

@Transactional표기법은 트랜잭션의 시작 시간과 종료 시간을 지정하는 트랜잭션 범위를 설정합니다. 이를 경계라고도 합니다.이 경계 밖에서 작업하면 오류가 발생하거나 예상대로 작동하지 않습니다.

먼저, 저는 이 문서의 일부가 봄 거래에서 가장 유용하다는 것을 알았습니다: http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html , 특히 이 섹션.

둘째, 추적 수준 로그와 SQL 문을 사용하여 이를 디버깅할 수 있습니다.그렇게 하기 위해 나는 다음을 나의 컴퓨터에 추가했습니다.application.properties동일한 내용을 사용자 환경에 추가할 수 있습니다.application.yml약간의 조정으로.

spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.show-sql=true
logging.level.org.hibernate=TRACE

여기에는 많은 양의 출력물이 있을 것입니다. 하지만 여러분은 배후에서 무슨 일이 일어나고 있는지 잘 알 수 있을 것입니다.

셋째, 그리고 사용법을 배우는데 있어서 가장 중요한 부분입니다.@TransactionalDAO에 대한 모든 호출은 동일한 트랜잭션 범위 내에 있는 경우 새 세션을 만들거나 기존 세션을 재사용하는 것입니다.이에 대한 예는 위의 문서를 참조하십시오.

업데이트된 개체를 다시 읽을 때 트랜잭션이 여전히 열려 있는 것으로 간주됩니다.한 번 해보세요flush저장 방법에서 변경사항을 데이터베이스에 유지하는 데 도움이 되는지 확인합니다.

위의 리소스를 사용하여 너무 많은 사냥을 하지 않고도 문제를 찾을 수 있기를 바랍니다. 그렇지 않다면 적어도 지속성이 지속되지 않는 이유에 대한 몇 가지 완전한 정보를 가지고 있어야 합니다.

드디어 해결책을 찾았어요내가 갱신하려는 실체에는 "불변의 주석"이 붙어 있었습니다.

저는 당신의 문제가 주석 @UserCanCud로 수행하는 가로채기에 있다고 생각합니다.

저는 방금 당신이 제안한 것과 같은 설정으로 프로젝트를 만들었고 그것은 올바르게 작동합니다.다음을 살펴보십시오.

https://github.com/nitzap/spring-data-mysql

제가 뭔가 부족한 게 있으면 언제든 말씀해 주세요.

개체를 저장하려면 적절한 jpa 구성을 설정해야 하며 저장소를 저장해야 합니다.

예를 들어 아래와 같이 사용자 엔티티와 userRepository가 있습니다.

User Enity Class

package com.sanjeev.domain;

import javax.persistence.*;

@Entity(name = "user")
@Table(name = "user")
public class User {

    @Id
    @Column(name = "id")
    private Long id;
    @Column(nullable = false)
    private String username;
    @Column(nullable = false)
    private String email;
    @Column(nullable = false)
    private String password;

 //getters and setters   
}

User Repository class

package com.sanjeev.repository;    
    import com.sanjeev.domain.User;
    import org.springframework.data.jpa.repository.JpaRepository;

    public interface UserRepository extends JpaRepository<User, Long> {

    }

User Service class

package com.sanjeev.service;

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import com.sanjeev.repository.UserRepository;
import com.sanjeev.domain.User;

@Service
public class UserService{

  @Autowired
  private UserRepository userRepository;

  public void saveUser(User user){
    userRepository.save(user);
  }


}

If you will follow above steps then your object must me saved

자세한 내용은 여기를 클릭하십시오.

만약 누군가에게 도움이 된다면, 저는 ReadRepos와 WriteRepos를 위한 별도의 컨트롤러를 가지고 있고 다른 데이터베이스(하나는 마스터, 다른 하나는 슬레이브)를 사용하고 있었습니다.기술적으로 두 저장소 모두 JPA 저장소를 통해 직간접적으로 CRUD 저장소를 확장하여 저장(Entity) 방법에 액세스할 수 있습니다.

따라서 readRepo를 실수로 사용하여 저장하는 동안 오류를 던지는 대신 호출을 무시했습니다.

결론은 동일한 상황에서 writeRepo를 사용하여 저장/업데이트하는지 확인하는 것입니다.

언급URL : https://stackoverflow.com/questions/43966901/spring-boot-jpa-hibernate-does-not-commit-when-repository-save

반응형