Сопоставление @OneToMany с составным первичным ключом не работает должным образом - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь реализовать отображение OneToMany с помощью составного первичного ключа в моем приложении.Сущности, включенные в приложение, следующие:

// Config data
@Data
@Entity
public class Config {

    @Id
    @GeneratedValue
    private int id;

    @OneToMany(mappedBy = "config", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    private Set<Mapping> mappings;
}

Класс с составным ключом:

@Data
@Entity
public class Mapping {
    @EmbeddedId
    private MappingId mappingId;

    @ElementCollection
    private List<Integer> values;

    @ManyToOne
    @JoinColumn(name = "id", nullable = false, insertable = false, updatable = false)
    private Config config;
}

Составной ключ:

@Data
@Embeddable
public class MappingId implements Serializable {
    private int id;
    private String comment;
}

Теперь,Я пытаюсь сохранить следующие данные Config json:

{
    "mappings": [
        {
            "mappingId": {
                "comment": "comment#1"
            },
            "values": [
                123,
                456
            ]
        }
    ]
}

Код должен автоматически генерировать значение для столбца id и назначать его для Config.id и Mapping.mappingId.id.Но значения этих переменных не совпадают.После вызова метода save для объекта config значение Config.id устанавливается на 1, тогда как Mapping.mappingId.id устанавливается на 0, что является неправильным.Может кто-нибудь сказать мне, что здесь происходит не так?

Спасибо.

1 Ответ

0 голосов
/ 31 января 2019

Вам не хватает аннотации @MapsId в атрибуте Config config.

Аннотация @MapsId сообщает Hibernate, что первичный ключ связанного объекта должен использоваться как первичный ключ или как часть составного первичного ключа.Если вы используете его с составным первичным ключом, вам нужно сослаться на атрибут, которому должно быть сопоставлено значение первичного ключа ассоциированной сущности.

Это сопоставление должно установить значение Config.id как Mapping.mappingId.id:

@Data
@Entity
public class Mapping {
    @EmbeddedId
    private MappingId mappingId;

    @ElementCollection
    private List<Integer> values;

    @ManyToOne
    @JoinColumn(name = "id", nullable = false, insertable = false, updatable = false)
    @MapsId("id")
    private Config config;
}

И здесь вы можете увидеть полный пример такого отображения.

...