我正在使用Sping Boot + JPA编写一个应用程序,使用Postgres数据库。我有一个User Entity,我试图在保存和/或修改用户记录时获取时间戳。这不起作用。正在保存的记录对于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)
型
仍然无法填充时间戳。
6条答案
按热度按时间fkaflof61#
在
@PrePersist
和@PreUpdate
阶段中调用AuditingEntity方法。这意味着在执行insert或update SQL语句之前调用它们。
在Hibernate文档中阅读更多关于JPA事件的信息:https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#events-jpa-callbacks
单元测试
在测试中使用时,必须同时在测试中启用审核
字符串
uoifb46i2#
我有类似的问题(Sping Boot 2.2.1和JUnit 5)与
null
值。将@EnableJpaAuditing
添加到测试类不起作用。我的例子(没有复制一切):
字符串
各自的阶级:
型
我有以下审计配置:
型
要让
@CreatedBy
和@CreatedDate
在测试中工作,只需要@Import
型
使用的参考文献:
pgx2nnw83#
我也有类似的问题,但我的情况是,我有
@Transactional
注解的测试类,删除后,一切都按预期工作。7z5jn7bk4#
我的首选解决方案是一组多个注解,以确保
@CreatedBy
或@CreatedDate
的测试:字符串
我的实体看起来像:
型
我的JPA配置是:
型
现在,您的审计字段也在JPA测试期间创建:
型
mcvgt66p5#
面对同样的问题,但其他解决方案没有帮助。(我使用Kotlin)然后我意识到我已经将@LastModifiedBy的字段声明为瓦尔,而不是var,即只读。它没有更新失败,只是默默地什么也没做。当我将字段声明更改为var时,它开始正常工作。
u91tlkcl6#
你必须使用
字符串