0

我想@OneToOne使用 ID 创建单向关系。让我们考虑以下示例:

@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。我尝试使用许多不同的注释组合,但我仍然遇到删除问题。我正在使用用户的 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>. 事实证明,让它获取。EAGER 防止用户被删除...感谢大家的宝贵时间。我不知道这可能是一个问题,所以我没有提到它......

4

2 回答 2

1

您需要的是级联删除,您可以通过传递orphanRemoval=true给您的@OneToOne注释来实现。

例子:

    @OneToOne(orphanRemoval=true)
    var address: UserAddress? = null

或者,您也可以使用cascade=CascadeType.REMOVE代替orphanremoval=true.

从ObjectDB借来的:

如果orphanRemoval=true指定了断开连接的地址实例,则会自动删除。这对于清理在没有来自所有者对象(例如 Employee)的情况下不应该存在的依赖对象(例如地址)很有用。如果仅cascade=CascadeType.REMOVE 指定,则不会采取自动操作,因为断开关系不是删除操作。

希望这可以帮助!

于 2020-02-25T07:38:46.750 回答
0

各种问题。

  • 映射是错误的方式。@JoinColumn需要在另一边,即与 FK 一起。您现在定义它的方式实际上是在说地址取决于(有一个 FK 到)地址。

  • 您已经重新定义了@Id依赖实体上的字段,即使它从User实体派生其 ID。您需要删除它并在此处通过注释关系来表明它是共享的主键关系@Id

鉴于此,您需要使其成为双向关系:

用户:

@Table(name = "user")
@Entity
class User (

    @Id
    @GeneratedValue(...)
    var id: Long? = null,

    @OneToOne(cascade = [CascadeType.All], mappedBy="user")
    var address: UserAddress? = null
)

地址:

@Table(name = "user_address")
@Entity
class UserAddress(
    @Id
    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "id")
    var user: User? = null
    (...)
) 
于 2020-02-25T10:56:25.030 回答