java - JPA delete 在后台执行更新查询
问题描述
我正在尝试使用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方式。
我使用本机查询来删除事件,它就像一个魅力。它删除事件以及多对多关系表。
我的服务如下所示:
@Resource
private EventRepository eventRepository;
@Transactional
public void deleteEvent(Long id) {
eventRepository.customDelete(id);
}
我不得不添加@Transactional,因为DELETE 操作需要在事务中执行。
这是存储库本机查询:
@Modifying
@Query(value = "DELETE FROM event WHERE id = ?1", nativeQuery = true)
void customDelete(Long id);
使用 INSERT、UPDATE、DELETE 时,您需要使用@Modifying进行查询。
推荐阅读
- android - AlarmManager 不调用服务
- angular - 如何在 CKEditor5 Angular 中编写自定义上传适配器
- php - 如何在WordPress中将评论框放在姓名和电子邮件输入框下方?
- php - 向 Curl 发布的数据有问题 - curl 没有响应
- mongodb - 如何在控制台中仅记录来自 MONGODB 的对象属性
- sql-server - 一列是否有可能是不同表的外键
- c# - 为什么 Wingdings 2 不在 rdlc reportviewers 中解释,而是在 pdf 中解释?
- windows - 批处理 - 检查给定进程是否以管理员权限运行
- c# - 为什么 Visual Studio 将 DLL/EXE 复制到 c# 中引用的项目构建文件夹中?
- go - 如何让 filepath.IsAbs 正确识别绝对路径?