如何解决休眠@OneToOne 单向映射...级联删除 双向外键以主体/父母的主键为外键的双向单向
我正在使用 Hibernate 开发 Spring Boot 应用程序,我只是想了解在使用级联删除时处理 OneToOne 映射的正确方法。
所以,我们有一个 User 表和一个 PasswordResetToken 表。用户具有标准用户列:id、用户名、密码、电子邮件。
密码重置令牌有一个 id、一个到 userId 的 FK 和一个用于令牌的字符串。
所以,我现在的问题是:我如何正确建模以便我们可以正确地级联删除?
我的想法是我们有一个单向映射,因为密码重置令牌有一个到用户的 FK,而用户没有到密码重置令牌的 FK。
所以我认为我们会将 @OneToOne 放在 Java 中的 PasswordResetToken 类上,并且在我们的 User 类中没有对 PasswordResetToken 的引用,但是 PasswordResetToken 类将具有对 User 对象的引用。
但是,通过一些stackoverflowing,我发现尽管父对象的表没有对子对象的表的引用(因为用户表没有其中有一个 PasswordResetToken),它允许将级联删除添加到 @OneToOne 注释中,这意味着当用户被删除时,所有子级也将被删除。
那么,哪种方式才是对这种关系建模的正确方式?
感谢您的时间
解决方法
有很多方法可以解决您的问题。有些更少,有些效率更高。
双向外键
@Entity
public class PasswordResetToken {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User User;
// other fields
}
@Entity
public class User {
@OneToOne(mappedBy = "user",cascade = CascadeType.ALL,fetch = FetchType.LAZY,optional = false)
private PasswordResetToken passwordResetToken;
// other fields
}
以主体/父母的主键为外键的双向
由于是 1-1 关系,您可以使用 User
的 ID 作为 PasswordResetToken
表的主键。
@Entity
public class PasswordResetToken {
@OneToOne(fetch = FetchType.LAZY)
@MapsId
private User User;
// other fields
}
@Entity
public class User {
@OneToOne(mappedBy = "user",optional = false)
private PasswordResetToken passwordResetToken;
// other fields
}
单向
如果您想进行单向映射,并将 PasswordResetToken
实体作为 User
实体的一部分,您必须将外键移动到 User
表,因为 {{ 1}} 必须应用于拥有外键的实体。
@JoinColumn
至于性能,最有效的是双向 @Entity
public class User {
@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn("password_reset_token_id") // FK in User table
private PasswordResetToken passwordResetToken;
// other fields
}
。双向 @MapsId
效率较低,我不确定单向映射。一对一映射在实践中并不常见,我不确定人们使用单向映射的频率。可能根本不是,因为外键通常在依赖端。
我不知道令牌有多大,但是将令牌存储在 User
实体中作为简单列有什么问题?您可以使用 @Embeddable
抽象某些部分,但实际上这应该 IMO 在同一个表中。如果您关心获取的数据量,则应该使用 DTO 来减少数据量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。