当前位置: 首页 > 知识库问答 >
问题:

删除具有一对一关系的实体

雷硕
2023-03-14

我的两个实体有一对一的关系

@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"), name = "library_user")
public class AppUser {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @EqualsAndHashCode.Exclude
    private Long id;

    // other fields

    @OneToOne(mappedBy="user", cascade={CascadeType.REMOVE,CascadeType.PERSIST}, orphanRemoval = true)
    private PasswordResetToken token;

    // getters/setters and equals/hashcode 
}

@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(name = "password_reset_token")
public class PasswordResetToken {
    private static final int EXPIRATION = 60 * 24;

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

    // other fields

    @OneToOne(targetEntity = AppUser.class, fetch = FetchType.EAGER, cascade={CascadeType.REMOVE,CascadeType.PERSIST}, orphanRemoval = true)
    @JoinColumn(nullable = false, name = "user_id")
    private AppUser user;

    // getters/setters and equals/hashcode 

我尝试通过此方法删除我的用户实体

    public void deleteUser(Long id) {
        resetTokenRepository.deleteAllByUserId(id);
        userRepository.deleteById(id);
    }

PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id)

@Repository
public interface PasswordResetTokenRepository extends JpaRepository<PasswordResetToken, Long> {
    void deleteAllByUserId(Long id);
}

但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.PasswordResetToken.user 我阅读了几个网站如何删除一对一的关系,但他们的建议对我没有帮助。例如,我尝试了很多注释级联={CascadeType.ALL}的变体,尝试了所有变体(CascadeType.REMOVE,CascadeType.PERSIST等),每次我都得到同样的错误。请帮助我了解我做错了什么。

共有1个答案

鲁鸿朗
2023-03-14

试试这个:

@OneToOne(cascade = CascadeType.REMOVE, orphanRemove = true)

这里是完整的解释。

 类似资料:
  • 我在删除子实体项目时遇到问题。每次我删除它的时候,什么都没有发生,父节点和子节点之间的关联仍然存在。我在网上搜索过,有些人建议使用orphanremoval,但我试过了,没有用。如果任何人可以建议,不胜感激。我的代码如下: 资产实体 (CHILD) 是单向关系,因此资产实体不包含任何@ManyToOne 在我的 SQL 数据库表中,我的关系CLIENTPROFILE_CLIENTASSET,它们通

  • 我有一个名为 Article 的实体类,另一个名为 ArticleTag 的实体。这两个实体是许多多属性关系,这意味着许多文章可以链接到同一个标签,并且许多标签可以与同一篇文章相关联。 在我的文章实体中,我有以下内容: 在我的ArticleTag实体中,我有这个: 当我的控制器被调用来删除一篇文章时,我在我的ArticleDao类中使用了一个方法,该方法基本上正在这样做: 但是,我的文章无法删除。

  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 我正在用Java、Spring和JPA开发一个web应用程序。我有这两个实体,它们代表一个用户及其后续通知。当一个用户跟踪另一个用户时,被跟踪的用户将收到一个follow通知。 我想删除User并删除它的所有通知,但我想保留通知的引用用户,也就是开始跟踪主用户的用户。唯一的问题是,当我尝试删除用户时,会出现以下错误: com.mysql.jdbc.exceptions.jdbc4.mysqlint

  • 在我的Spring/MySql系统中,我有一些Jpa实体,它们通过父关系上的joinTable在OneToMany关系中连接。在这种情况下,一个帖子有很多评论。 如果我尝试删除Post实体,问题是生成的SQL试图删除仍在连接表中的注释,从而触发外键冲突。 什么是正确的方法: 删除连接表项 删除连接表左侧父关系实体 删除连接表右侧子关系实体 要记住的一些事情: 还有其他实体通过oneTo多项关系拥有

  • 问题内容: 我在Hibernate中具有以下一对一关系(可能为null): 我正在尝试使用HQL选择所有具有非空详细信息的实体: 但这会返回所有实体,无论详细信息是否为空。 那么正确的HQL是什么? 问题答案: 好的,我找到了解决方案: