我想使用ID创建一个@OneToOne
单向关系。
让我们考虑以下示例:
@Table(name = "user")
@Entity
class User (
@Id
@GeneratedValue(...)
var id: Long? = null,
@OneToOne
var address: UserAddress? = null
)
@Table(name = "user_address")
@Entity
class UserAddress(
@Id
var id: Long? = null,
(...)
)
在数据库上,
user_address.id
引用user.id
时有外键约束。我尝试使用许多不同的注释组合,但是删除仍然存在问题。我正在使用User的JpaRepository,并且在调用
userRepository.deleteById(id)
时,仅删除了子级(address
),而不删除了父级(user
)。我真的想保留名称为“ id”的@Id
列。可能吗编辑
当我使用以下代码时:
@Table(name = "user")
@Entity
class User (
@Id
@GeneratedValue(...)
var id: Long? = null,
@OneToOne(cascade = [CascadeType.All])
@JoinColumn(name = "id", referencedColumnName = "id")
var address: UserAddress? = null
)
@Table(name = "user_address")
@Entity
class UserAddress(
@Id
var id: Long? = null,
@OneToOne(mappedBy = "address")
var user: User? = null
(...)
)
调用
userRepository.deleteById(id)
时,仅删除子级。我不知道为什么。此外,我想保持这种关系是单向的。编辑用户资料库
@Repository
interface UserRepository : JpaRepository<User, Long> {
}
编辑-解决
好。我有另一个具有
Set<User>
的实体(我们称为Company)。事实证明,具有获取功能。 EAGER防止删除用户...谢谢大家的宝贵时间。我不知道这可能是个问题,所以我没有提到它。
最佳答案
您需要的是级联删除,您可以通过将orphanRemoval=true
传递给@OneToOne
批注来实现。
例:
@OneToOne(orphanRemoval=true)
var address: UserAddress? = null
或者,您也可以使用
cascade=CascadeType.REMOVE
代替orphanremoval=true
。从ObjectDB借来的:
如果指定了
orphanRemoval=true
,则断开连接的Address实例被自动删除。这对于清理依赖项很有用
没有以下人员的引用就不应该存在的对象(例如地址)
所有者对象(例如Employee)。如果仅
cascade=CascadeType.REMOVE
由于断开了与
关系不是删除操作。
希望这可以帮助!