gpt4 book ai didi

java - Spring 数据 JPA : how to enable cascading delete without a reference to the child in the parent?

转载 作者:可可西里 更新时间:2023-11-01 07:01:15 25 4
gpt4 key购买 nike

也许这是一个过于简单的问题,但当我尝试删除用户实体时出现异常。

用户实体:

@Entity
@Table(name = "users")
public class User
{
@Transient
private static final int SALT_LENGTH = 32;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@NotNull
private String firstName;

@NotNull
private String lastName;

@Column(unique = true, length = 254)
@NotNull
private String email;

// BCrypt outputs 60 character results.
@Column(length = 60)
private String hashedPassword;

@NotNull
private String salt;

private boolean enabled;

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
private Date createdDate;

我有一个实体类,它使用外键引用用户。我想要发生的是,当用户被删除时,所有引用该用户的 PasswordResetToken 对象也将被删除。我该怎么做?

@Entity
@Table(name = "password_reset_tokens")
public class PasswordResetToken
{
private static final int EXPIRATION_TIME = 1; // In minutes

private static final int RESET_CODE_LENGTH = 10;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String token;

@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)
@JoinColumn(nullable = false, name = "userId")
private User user;

private Date expirationDate;

我得到的异常归结为 无法删除或更新父行:外键约束失败` (`id`))

我想避免在父实体中添加对 PasswordResetToken 的引用,因为 User 不需要了解有关 PasswordResetToken 的任何信息>.

最佳答案

如果不创建双向关系,就不可能在 JPA 级别上实现。您需要在 User 类中指定级联类型。 User 应该是关系的所有者,它应该提供有关如何处理相关 PasswordResetToken 的信息。

但如果您不能建立双向关系,我建议您直接在模式生成 SQL 脚本中设置关系。

如果您通过 SQL 脚本而不是通过 JPA 自动生成创建模式(我相信所有严肃的项目都必须遵循这种模式),您可以在那里添加 ON DELETE CASCADE 约束。

它看起来像这样:

CREATE TABLE password_reset_tokens (
-- columns declaration here
user_id INT(11) NOT NULL,
CONSTRAINT FK_PASSWORD_RESET_TOKEN_USER_ID
FOREIGN KEY (user_id) REFERENCES users (id)
ON DELETE CASCADE
);

这里是 the documentation关于如何在 spring boot 中使用数据库迁移工具。这是the information关于如何从 hibernate 生成模式脚本(这将简化编写您自己的脚本的过程)。

关于java - Spring 数据 JPA : how to enable cascading delete without a reference to the child in the parent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44170533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com