java - JPA删除在后台执行更新查询

标签 java mysql spring hibernate jpa

我尝试使用 JpaRepository.deleteById() 从数据库中删除我的 JPA 实体,但出现了一个奇怪的错误:

NULL not allowed for column "USER_ID"; SQL statement:
update event set from_date=?, name=?, user_id=?, until_date=? where id=? [23502-199]

如您所见,它执行UPDATE查询,但我不知道为什么。

我的模型看起来像这样

@Entity
@Data
@NoArgsConstructor
public class Event {

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

    @Column(nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
    private User organizer;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Date fromDate;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Date untilDate;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "event_allowed_users",
            joinColumns = @JoinColumn(name = "event_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"))
    private List<User> allowedUsers;
}
@Data
@Entity
@NoArgsConstructor
public class User {

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

    @Column(unique = true)
    private String user;

    @Column(unique = true)
    private String mail;

    private boolean active;
}

我也有自己的 SQL 架构查询

create table user (id bigint NOT NULL AUTO_INCREMENT, active boolean not null, mail varchar(255) not null unique, user varchar(255), primary key (id));

create table event (id bigint NOT NULL AUTO_INCREMENT, name varchar(255), from_date timestamp not null, until_date timestamp not null, user_id bigint not null, primary key (id));

alter table event add constraint fk_user_id1 foreign key (user_id) references user(id);

create table event_allowed_users (event_id bigint, user_id bigint, foreign key (event_id) references event(id) on delete cascade, foreign key (user_id) references user(id) on delete cascade);

知道我在哪里犯了错误吗?

最佳答案

我已经解决了这个问题,但不是ORM方式。

我使用 native 查询来删除该事件,它就像一个 super 按钮。它删除事件以及ManyToMany 关系表。

我的服务如下所示:

@Resource
    private EventRepository eventRepository;

@Transactional
public void deleteEvent(Long id) {
    eventRepository.customDelete(id);
}

我必须添加@Transactional,因为DELETE操作需要在事务中执行。

这是存储库 native 查询:

@Modifying
@Query(value = "DELETE FROM event WHERE id = ?1", nativeQuery = true)
    void customDelete(Long id);

当使用INSERT、UPDATE、DELETE时,您需要使用@Modifying进行查询。

关于java - JPA删除在后台执行更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60510317/

相关文章:

mysql - 我可以通过 Sequel Pro 连接到数据库,但不能通过命令行

mysql - 如何将 MySQL 变量放入Where子句中

java - 使用 SpringData 存储 map

java - StAX createXMLEventReader 我应该使用 BufferedReader 吗?

java - 在 Java 中比较日期作为字符串

java - 如何在 Java 的 Native HTTP Client 上使用代理密码身份验证

java - 限制需要反序列化的json字段为java对象的字段

java - 如何修改一个大的 json 字符串?

mysql - 如何提高mysql中大文本的查询速度

java - 回到基础 : Apache Camel Routes and Direct Component