kotlin - Spring Data:从父级中删除子关系时如何自动删除子关系
问题描述
我有一个实体,它在关系User
中拥有一个Character
实体。@OneToOne
但是,我希望他的记录在与实体Character
分离后立即被删除。User
这是我的User.kt
实体类:
// User.kt
@Entity
class User(
@Id
var id: String,
var email: String,
@OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
var character: Character?,
var isAdmin: Boolean
) { // ... }
这是我为测试此行为而编写的单元测试:
// UserRepositoryTest.kt
@Test
fun `should remove orphan character entity when being removed from user entity`() {
val user = UserTestTemplate.testUser()
val character = CharacterTestTemplate.testCharacter()
user.character = character
userRepository.save(user)
user.character = null
userRepository.save(user)
val actual = userRepository.findById(user.id).orElse(null)
assertThat(actual).isNotNull()
assertThat(actual.character).isNull()
val savedCharacter = characterRepository.findById(character.id)
assertThat(savedCharacter.get()).isNull() // fails
}
我添加了CascadeType.ALL
andorphanRemoval = true
选项,因为这些是我读到的与我的请求相关的唯一内容。
我在单元测试中所做的是创建用户和角色实例。然后将角色实例添加到用户并通过UserRepository
. 由于CascadeType.ALL
字符实例将自动保存。现在,当从用户中删除角色时,我想反过来做同样的事情。但是,正如您在单元测试的最后一行中看到的那样,这并没有按预期工作
解决方案
有两点需要注意:
- 事务性写入模式
- 一级缓存
@Test
fun `should remove orphan character entity entity`() {
val user = UserTestTemplate.testUser()
val character = CharacterTestTemplate.testCharacter()
user.character = character
userRepository.save(user)
user.character = null
//use saveAndFlush here to force immediate DB update
//otherwise may be deferred until transactional method returns
userRepository.saveAndFlush(user)
//clear the persistence context to ensure you will be reading from
//the database rather than first level cache
//entityManager is injected to test via @PersistenceContext annotation
entityManager.clear();
//now you are guaranteed a db read reflecting all flushed updates
val actual = userRepository.findById(user.id).orElse(null)
assertThat(actual).isNotNull()
assertThat(actual.character).isNull()
val savedCharacter = characterRepository.findById(character.id)
assertThat(savedCharacter.get()).isNull() // fails
}
推荐阅读
- linux - Linux Centos Selenium Chromedriver 错误:ChromeDriver 假设 Chrome 已崩溃
- r - 提取 R 中多个不变自变量的系数和 p 值列表
- r - 在 R 中将多个数据集与多个工作表绑定
- c++ - 是否可以使用 C++17 内联成员强制跨 TU 的全局变量的初始化顺序?
- r - 为ggplot中的同类变量分配相似的颜色
- python-3.x - scrapy RuntimeError: 要使用 XPath 或 CSS 选择器,ItemLoader 需要用选择器实例化
- html - 如何在 Bootstrap 下拉列表的标签中显示所选项目?
- android - 将文件从 android 应用程序上传到我的 S3 存储桶
- java - 如何使用 GSON 反序列化数组数组
- spring-boot - Spring数据JPA-休眠多对多关系在链接实体表中插入null