我想使用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
由于断开了与
关系不是删除操作。


希望这可以帮助!

08-18 06:36
查看更多