首页 > 解决方案 > 尝试使用复合键保存实体时出现 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 个参数我尝试重新创建数据库并且问题仍然存在,但是当我删除复合键时它可以工作

标签: javaspring-boothibernatejpamariadb

解决方案


当您需要通过 a或映射insertable=false, updatable=false在实体中多次映射字段时,定义很有用。OneToOneManyToOne

我认为要解决此问题,您需要insertable=false, updatable=falseColumn注释中删除。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships


推荐阅读