【问题标题】:Hibernate delete cascading isn't working when using sql query使用 sql 查询时,休眠删除级联不起作用
【发布时间】:2021-09-09 15:40:51
【问题描述】:

我有与 Day Entity 相关的 User Entity 和 OneToMany 映射。我正在尝试删除用户实体并使用 CascadeType.REMOVE 删除它的天数。但是当我以这种方式使用 sql 查询时,级联不起作用

        Query theQuery =
                currentSession.createQuery(
                        "delete from User where id=:userId");
        theQuery.setParameter("userId", id);

        theQuery.executeUpdate();

现在,当我尝试以这种方式删除用户时,级联工作并且它的日子也被删除了:

 Session currentSession = entityManager.unwrap(Session.class);

        user gets deleted
        User theUser = findById(id);

        currentSession.remove(theUser);

这是用户实体映射


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


    @Column(name="first_name")
    private String first_name ;

    @Column(name="last_name")
    private String last_name ;

    @OneToMany(mappedBy = "user", cascade = {CascadeType.REMOVE})
    List<Day> days;
 
}

这是我的 Day Entity 映射


@Entity
@Table(name = "day")
public class Day {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id ;


    @Column(name = "date")
    Date date ;

    @ManyToOne()
    @JoinColumn(name = "user_id")
    User user ;

   
}

这是我得到的错误:

: Cannot delete or update a parent row: a foreign key constraint fails (`demo`.`day`, CONSTRAINT `day_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))

【问题讨论】:

  • 本机查询忽略休眠注释。
  • 所以我是否应该在删除对象之前始终阅读它,以便通过级联删除它的相关实体? @詹斯

标签: java mysql spring hibernate orm


【解决方案1】:

在数据库表“day”中,您必须在创建时添加 user_id “on delete cascade”。 或迁移:

alter table day add foreign key (ID) references user(ID) on DELETE CASCADE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多