Как отобразить только значения HashMap - Hibernate - PullRequest
1 голос
/ 21 марта 2020

Я бы хотел отобразить только значения карты в базу данных. В приведенном ниже примере в классе Holder есть карта идентификатора Entity, представляющая собой идентификатор a BigInteger и сущность Item. Я делаю это потому, что хочу быстрый поиск и хэш-карту K, V хорош для этого. Но теперь отображение странное.

JoinTable holder_items теперь имеет 3 столбца, holder_id. item_id и item_KEY. Могу ли я иметь только older_id и item_Id?

По сути, сопоставление только items.values() с текущим держателем.

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

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "holder_items",
            joinColumns = @JoinColumn(name = "holder_id"),
            inverseJoinColumns = @JoinColumn(name = "item_id")
    )
    private Map<BigInteger, Item> items = new HashMap<>();
    //(...)
}

@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "BIGINT")
    private BigInteger id;
    //(...)
}

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Вы можете сделать это отображение без третьей таблицы, если нет необходимости в c. Пример:

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

    @MapKey(name = "id")
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="holder")
    private Map<BigInteger, Item> items = new HashMap<>();
@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "BIGINT")
    private BigInteger id;

    @ManyToOne
    private Holder holder;
}
0 голосов
/ 21 марта 2020

Решение с помощью @ Энтони

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

    @MapKey(name = "id")
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
        name = "holder_items",
        joinColumns = @JoinColumn(name = "holder_id"),
        inverseJoinColumns = @JoinColumn(name = "item_id")
    )
    private Map<BigInteger, Item> items = new HashMap<>();

-

@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "BIGINT")
    private BigInteger id;
}

Результаты в таблице holder_items с holder_id и item_id, а желательно!

...