[SPRING] JPE @ CreatedDate @LastModifiedDate가 객체를 저장할 때 채워지지 않습니다.
SPRINGJPE @ CreatedDate @LastModifiedDate가 객체를 저장할 때 채워지지 않습니다.
Postgres 데이터베이스를 사용하여 Spring Boot + JPA로 응용 프로그램을 작성 중입니다. 사용자 엔티티가 있는데 사용자 레코드가 저장되거나 수정 될 때 타임 스탬프를 얻으려고합니다. 이것은 작동하지 않습니다. 저장된 레코드는 createdDate와 lastModifiedDate 모두에 대해 "null"을 갖습니다.
Kotlin의 모든 관련 코드는 다음과 같습니다.
@Entity
@Table(name = "app_user")
@EntityListeners(AuditingEntityListener::class)
data class User(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
val id: UUID? = null,
@NotNull
@Column(unique = true)
val email: String,
val name: String,
private val password: String,
@CreatedDate
@Column(name = "created_date", nullable = false, updatable = false)
var createdDate: LocalDateTime? = null,
@LastModifiedDate
@Column(name = "last_modified_date", nullable = false)
var lastModifiedDate: LocalDateTime? = null
)
날짜 필드를 추가하는 SQL 쿼리는 다음과 같습니다.
ALTER TABLE app_user
ADD COLUMN last_modified_date TIMESTAMP,
ADD COLUMN created_date TIMESTAMP;
나 또한 구성 클래스가있다.
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
class JpaAuditingConfiguration {
@Bean
fun auditorProvider(): AuditorAware<String> {
return AuditorAware { Optional.of(SecurityContextHolder.getContext().authentication.name) }
}
}
그리고 내 테스트 수업 :
@Autowired
private lateinit var userRepository: UserRepository
val user = User(
email = "email",
name = "name",
password = "password"
)
@Test
fun `it sets the timestamps when a user is created`() {
userRepository.save(user)
user.let {
assertThat(it.createdDate).isNotNull()
assertThat(it.lastModifiedDate).isNotNull()
}
}
최신 정보:
문제는 테스트에서만 발생합니다. 테스트 환경이 아닌 개발 환경에서 사용자를 생성 할 때 동일한 코드를 실행할 때 문제가되지 않는 것 같습니다.
테스트에서 추가 구성이 필요합니까?
업데이트 2
나는 또한 엔티티 관리자를 다음과 같이 사용하려고 시도했다.
@Autowired
lateinit var entityManager: TestEntityManager
그런 다음 테스트를 수행하십시오.
entityManager.persist(user)
entityManager.flush()
그리고 또한
entityManager.persistAndFlush(user)
여전히 타임 스탬프를 채우지 않습니다.
해결법
-
==============================
1.AuditingEntityListener 메서드는 @PrePersist 및 @PreUpdate 단계에서 호출됩니다.
AuditingEntityListener 메서드는 @PrePersist 및 @PreUpdate 단계에서 호출됩니다.
이는 삽입 또는 갱신 SQL 문이 실행되기 바로 전에 호출된다는 것을 의미합니다.
Hibernate 문서에서 JPA 이벤트에 대해 더 자세히 읽어보십시오. https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#events-jpa-callbacks
단위 테스트
테스트에서 사용할 때 테스트에서 감사를 활성화해야합니다.
@DataJpaTest @RunWith(SpringRunner.class) @EnableJpaAuditing public class EntityListenerTest {
from https://stackoverflow.com/questions/51709727/spring-boot-jpacreateddate-lastmodifieddate-not-being-populated-when-saving-th by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 통합 테스트에서 빈 재정의 (0) | 2019.07.05 |
---|---|
[SPRING] 스프링 부트 REST 애플리케이션에서 gzipped 요청 처리하기 (0) | 2019.07.03 |
[SPRING] 스프링 보안 필터 체인 작동 방법 (0) | 2019.07.01 |
[SPRING] 봄 부팅시 Tomcat에 대한 연결 시간 초과 증가 (0) | 2019.07.01 |
[SPRING] Java Spring 다중 ApplicationContext (0) | 2019.06.30 |