有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA delete在后台执行更新查询

我正在尝试使用JpaRepository从数据库中删除我的JPA实体。deleteById(),但我遇到了一个奇怪的错误:

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

如您所见,它执行一个更新查询,但我不知道为什么

我的模型看起来像这样

@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);

知道我在哪里犯的错吗


共 (1) 个答案

  1. # 1 楼答案

    我已经解决了这个问题,但不是用ORM的方法

    我使用了本地查询来删除事件,它就像一个符咒。它删除事件以及多个关系表

    我的服务如下所示:

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

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

    这是存储库本机查询:

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

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