Это мои классы

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", insertable = false, updatable = false)
    private Long streamId;

    @Id
    private String userIp;

    //...8 more fields

}

UserActivityd

@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 полей, а спящий режим пытается установить 12-й параметр, я попытался воссоздать базу данных, и проблема не исчезла, но когда я удаляю составной ключ, он работает

1
Alireza Dhb 24 Авг 2020 в 17:33

2 ответа

Лучший ответ

Итак, я наконец выяснил, в чем проблема, мне пришлось разместить @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", insertable = false, updatable = false)
    private Long streamId;

    @Id
    private String userIp;
0
Alireza Dhb 27 Авг 2020 в 21:21

Определение insertable=false, updatable=false полезно, когда вам нужно сопоставить поле более одного раза в сущности с помощью сопоставления OneToOne или ManyToOne.

Я думаю, чтобы решить эту проблему, вам нужно удалить insertable=false, updatable=false из аннотации Column.

Видеть, http://en.wikibooks.org/wiki/Java_Persistence_thows/Sequences_Others_City_City_City_City_City_City_City_City_Date_City_City_City >

0
Ousama 25 Авг 2020 в 09:41