我尝试使用 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/