【发布时间】:2019-01-13 12:53:36
【问题描述】:
我正在使用 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)
仍然没有填充时间戳。
【问题讨论】:
-
我已经编辑了我的问题。我无法自动填充日期字段。基本上我的测试失败了。我最终得到一个空记录而不是时间戳
标签: spring spring-boot kotlin spring-data-jpa