[英]Unidirectional @OneToOne using IDs
我想使用 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.id
user_address.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)
,只会删除 child。 我不知道为什么......此外,我想保持这种关系单向。
编辑用户存储库
@Repository
interface UserRepository : JpaRepository<User, Long> {
}
编辑 - 解决好的。 我有另一个实体(我们称之为公司),它有Set<User>
。 事实证明,拥有它 Fetch。 EAGER 防止用户被删除...感谢大家的时间。 我不知道这可能是一个问题,所以我没有提到它......
您需要的是级联删除,您可以通过将orphanRemoval=true
传递给您的@OneToOne
注释来实现。
例子:
@OneToOne(orphanRemoval=true)
var address: UserAddress? = null
或者,您也可以使用cascade=CascadeType.REMOVE
而不是orphanremoval=true
。
从ObjectDB借来的:
如果指定了
orphanRemoval=true
则自动删除断开连接的 Address 实例。 这对于清理在没有所有者对象(例如员工)的引用的情况下不应该存在的依赖对象(例如地址)很有用。 如果仅指定了cascade=CascadeType.REMOVE
则不会采取自动操作,因为断开关系不是删除操作。
希望这可以帮助!
各种问题。
映射是错误的。 @JoinColumn
需要在另一边,即与 FK。 您现在定义它的方式实际上是在说 Address 依赖于(有一个 FK to)地址。
您已经在依赖实体上重新定义了@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
(...)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.