Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Hibernate: связать две сущности с полями Map  [new]
brigad
Member

Откуда:
Сообщений: 16
Всем привет.

Знатоки JPA и Hibernate подскажите как связать две сущности, у которых есть поля типа Map<String, String> отношением @OneToMany?

Вот entity1:
+

@Entity
class Entity1 {
    @Id
    @Column(name="entity1_id")
    private Long id;

    @Column(name="entity1_name")
    private String name;

    @ElementCollection
    @CollectionTable(
        name = "map1",
        joinColumns = @JoinColumn(name = "entity1_id"))
    @MapKeyColumn(name = "map1_key")
    @Column(name = "map1_value")
    private Map<String, String> map1 = new HashMap<>();

    ...
}



Вот entity2:
+

@Entity
class Entity2 {
    @Id
    @Column(name="entity2_id")
    private Long id;

    @Column(name="entity2_name")
    private String name;

    @ElementCollection
    @CollectionTable(name = "map2",
        joinColumns = @JoinColumn(name = "entity2_id"))
    @MapKeyColumn(name = "map2_key")
    @Column(name = "map2_value")
    private Map<String, String> map2 = new HashMap<>();

    // не работает
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "map2",
            joinColumns = @JoinColumn(name = "entity2_id"),
            inverseJoinColumns = @JoinColumn(name = "entity1_id"))
    private Set<Entity1> entity1s;
    ...
}



Структура базы данных вот такая:
+

create table entity1
(
  entity1_id   int         not null unique,
  entity1_name varchar(10) not null,
  primary key (entity1_id)
);

create table map1
(
  entity1_id  int     not null,
  map1_key    int     not null,
  map1_value  decimal not null,
  primary key (entity1_id, map1_key),
  foreign key (entity1_id) references entity1 (entity1_id)
    on delete cascade
    on update cascade
);

create table entity2
(
  entity2_id   int         not null unique,
  entity2_name varchar(20) not null,
  primary key (entity2_id)
);

create table map2
(
  entity2_id int     not null,
  map2_key   int     not null,
  map2_value decimal not null,
  entity1_id    int     not null,
  primary key (entity2_id, entity2_key),
  foreign key (entity2_id) references entity2 (entity2_id)
    on delete cascade
    on update cascade,
  foreign key (entity1_id) references entity1 (entity1_id)
    on delete cascade
    on update cascade
);

insert into entity1 (entity1_id, entity1_name)
values (1, 'entity11'),
       (2, 'entity12'),
       (3, 'entity13');

insert into map1 (entity1_id, map1_key, map1_value)
values (1, 0, 0.1),
       (1, 1, 0.1),
       (1, 2, 0.1),
       (2, 3, 0.2),
       (2, 4, 0.2),
       (2, 5, 0.2),
       (3, 6, 0.3),
       (3, 7, 0.3),
       (3, 8, 0.3);

insert into entity2 (entity2_id, entity2_name)
values (1, 'entity21'),
       (2, 'entity22'),
       (3, 'entity23');

insert into map2 (entity2_id, map2_key, map2_value, entity1_id)
values (1, 0, 10, 1),
       (1, 1, 20, 1),
       (1, 2, 10, 2),
       (1, 3, 10, 2),
       (2, 0, 20, 2),
       (2, 1, 20, 2),
       (2, 2, 20, 3),
       (2, 3, 20, 3),
       (3, 0, 10, 3),
       (3, 1, 10, 3),
       (3, 2, 10, 1),
       (3, 3, 10, 1);

17 мар 19, 03:15    [21835014]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate: связать две сущности с полями Map  [new]
andreykaT
Member

Откуда:
Сообщений: 2192
Имхо, у тебя не хватает форинключа в таблице е1 на таблицу е2. Мамы тут не причем
17 мар 19, 10:30    [21835081]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate: связать две сущности с полями Map  [new]
brigad
Member

Откуда:
Сообщений: 16
andreykaT,

Они же связаны через таблицу map2.

Причем на уровне базы данных всё работает как надо, то есть к структуре БД вопросов нет.

А когда создаю e1 & e2 и пишу их в БД с помощью hibernate начинаются проблемы.
17 мар 19, 12:40    [21835137]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate: связать две сущности с полями Map  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
brigad
к структуре БД вопросов нет.
таблицы называют именем сущности.
И не назвают именем map, list, integer
17 мар 19, 13:05    [21835147]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate: связать две сущности с полями Map  [new]
brigad
Member

Откуда:
Сообщений: 16
Petro123,

Лучше скажи как работать с такой структурой БД в hibernate.
17 мар 19, 13:12    [21835153]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate: связать две сущности с полями Map  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
brigad
Petro123,

Лучше скажи как работать с такой структурой БД в hibernate.
зачем мне думать над извратом?
17 мар 19, 13:23    [21835162]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить