Композитный ключ JPA с 2 внешними ключами и дополнительным атрибутом (также является частью первичного ключа) - PullRequest
0 голосов
/ 05 ноября 2019

Я пытался реализовать нечто похожее на следующую структуру в JPA (Eclipselink):

class PrimaryInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "primaryInfo", orphanRemoval = true)
    private List<PrimaryInfoClubCode> clubCodes = new ArrayList<>();
}
class ClubCode {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "clubCode", orphanRemoval = true)
    private List<PrimaryInfoClubCode> holdingPrimaryInfos = new ArrayList<>();

    private String code;

    private String description;
}

Используя следующий EmbeddedId и таблицу соединения:

@Embeddable
class PrimaryInfoClubCodeId implements Serializable {
    private Long primaryInfoId;

    private Long clubCodeId;
}
class PrimaryInfoClubCode {
    @EmbeddedId
    private PrimaryInfoClubCodeId id;

    @ManyToOne(fetch = FetchType.EAGER)
    @MapsId("primaryInfoId")
    private PrimaryInfo primaryInfo;

    @ManyToOne(fetch = FetchType.EAGER)
    @MapsId("clubCodeId")
    private ClubCode clubCode;

    private Long counter;
}

Проблема, с которой я столкнулся сейчас, заключается в том, что я хотел бы, чтобы счетчик был частью первичного ключа, чтобы позволить PrimaryInfo иметь несколько записей ClubCode, пока они имеютотличающееся counter значение.

Следующий SQL генерируется из вышеупомянутой установки, и я считаю, что это корень проблемы, так как он должен скорее обновить любой из трех, а не только счетчик, так каклюбое из трех значений может быть изменено.

ОБНОВЛЕНИЕ PRIMARY_INFO_CLUB_CODE SET COUNTER =? ГДЕ ((CLUB_CODE_ID =?) И (PRIMARY_INFO_ID =?))

Я не уверен, как это сделать, и мне трудно понять это. У меня не было много сна, и я надеюсь, что это имеет смысл.

Любая помощь будет безмерно признательна.

...