java - 尝试使用复合键保存实体时出现 SQLSyntaxErrorException
问题描述
这些是我的课
用户活动
@Entity
@Data
@IdClass(UserActivityId.class)
public class UserActivity {
@ManyToOne
private User user;
@Id
@Column(name = "user_id", insertable = false, updatable = false)
private Long userId;
@ManyToOne
private Stream stream;
@Id
@Column(name = "stream_id", insertable = false, updatable = false)
private Long streamId;
@Id
private String userIp;
//...8 more fields
}
用户活动 ID
@Data
public class UserActivityId implements Serializable {
private Long userId;
private Long streamId;
private String userIp;
//constructors
}
溪流
@Entity
@Data
public class Stream {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "stream")
private List<UserActivity> UserActivities = new ArrayList<>();
}
用户
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
protected long id;
}
用户活动存储库
public interface UserActivityRepository extends JpaRepository<UserActivity, UserActivityId>
}
但是当我尝试保存这样的实体时:
var stream = streamRepository.findById(activity.getStreamId);
var user = userRespository.findById(activity.getUserId);
activity.setStream(stream);
activity.setUser(user);
userActivityRepository.save(activity);
我得到这样的异常:
java.sql.SQLSyntaxErrorException: (conn=1058) Could not set parameter at position 12 (values was 1)
Query - conn:1058(M) - "insert into user_activity (a, b, c, d, e, f, g, h, user_id, stream_id, user_ip) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
这很奇怪,因为我只有 11 个字段,而 hibernate 正在尝试设置第 12 个参数我尝试重新创建数据库并且问题仍然存在,但是当我删除复合键时它可以工作
解决方案
当您需要通过 a或映射insertable=false, updatable=false
在实体中多次映射字段时,定义很有用。OneToOne
ManyToOne
我认为要解决此问题,您需要insertable=false, updatable=false
从Column
注释中删除。
推荐阅读
- java - Jasper 报告中具有不同表格内容的多个页面
- c - 在 C99 中是否允许调用未声明的函数?
- xtermjs - xtermjs 是否有任何选项卡机制?
- c# - 一个脚本更改多个 UI 图像,但它不起作用
- memory - 二进制程序中的内存地址如何在运行时指向内存中的正确位置?
- android - 用于托管少量消息的数据库、api 或 web 服务,启动级别 noob
- python-3.x - 如何根据python中的列值合并两个数据框
- ios - 在 UISearchController 中搜索时无法在 tableView 中滚动
- python - 我使用 keras 尝试了 python 代码,但收到了警告
- vba - 我是否应该始终完全限定 VBA 中的方法和类