如何解决尝试使用复合键保存实体时发生SQLSyntaxErrorException
这些是我的课程
UserActivity
@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",updatable = false)
private Long streamId;
@Id
private String userIp;
//...8 more fields
}
UserActivityId
@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;
}
UserActivityRepository
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个参数 我尝试重新创建数据库,问题仍然存在,但是当我删除组合键时,它就起作用了
解决方法
当您需要通过insertable=false,updatable=false
或OneToOne
映射在实体中多次映射字段时,定义ManyToOne
很有用。
我认为要解决此问题,您需要从insertable=false,updatable=false
注释中删除Column
。
所以我终于发现问题出在哪里,我不得不将@id
放在关系引用(流,用户)的上方,而不是它们的外键,还需要向它们添加@MapsId
@ManyToOne
@Id
@MapsId
private User user;
@Column(name = "user_id",insertable = false,updatable = false)
private Long userId;
@ManyToOne
@Id
@MapsId
private Stream stream;
@Column(name = "stream_id",updatable = false)
private Long streamId;
@Id
private String userIp;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。