gpt4 book ai didi

保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate

转载 作者:行者123 更新时间:2023-12-02 09:41:52 25 4
gpt4 key购买 nike

我正在使用 Spring Boot + JPA 编写一个应用程序,使用 Postgres 数据库。我有一个用户实体,我试图在保存和/或修改用户记录时获取时间戳。这是行不通的。正在保存的记录的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)

仍然没有填充时间戳。

最佳答案

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 {

关于保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51709727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com