У меня есть следующая структура базы данных (security_margin — от одного ко многим до security_margin_service_model):
У меня есть следующий код в объекте jpa с именем SecurityMargin, где я пытаюсь смоделировать таблицу соединений для трех объектов (security_margin, model и service)
@Column
@OneToMany
@JoinTable(name = "security_margin_service_model",
joinColumns = {@JoinColumn(name = "margin_id")},
inverseJoinColumns = {@JoinColumn(name = "service_id")})
List<Service> services = new ArrayList<>();
@Column
@OneToMany
@JoinTable(name = "security_margin_service_model",
joinColumns = {@JoinColumn(name = "margin_id")},
inverseJoinColumns = {@JoinColumn(name = "model_id")})
List<Model> models = new ArrayList<>();
Когда я сохраняю объект SecurityMargin, я ожидаю увидеть что-то вроде этого:
и вместо этого я храню их в двух разных строках.
Не уверен, как сказать hibernate не вызывать вставку дважды в этом случае... Я потерялся!
Любая помощь действительно ценится. Спасибо!





Результат, который вы получаете, ожидаем, поскольку у вас есть две независимые коллекции, которые просто используют одну и ту же таблицу для своего сопоставления. Предположим, у вас есть несколько сервисов и одна модель, тогда это может привести к большому количеству комбинаций: Сервисная маржа (sm_id1): сервис: [ 1, 2 ] модель: [ 1 ]
должно ли это привести к
[ sm_id1, 1, 1 ]
[ sm_id1, 2, null ]
или
[ sm_id1, 1, null ]
[ sm_id1, 2, 1 ]
или
[ sm_id1, 1, null ]
[ sm_id1, 2, null ]
[ sm_id1, null, 1 ]
Самый простой способ добиться того, о чем вы просите, — создать еще одну сущность, которая будет сопоставлена с таблицей security_margin_service_model и иметь в ней одну пару Service/Model. Тогда вместо двух коллекций в SecurityMargin у вас будет одна коллекция этого нового объекта.
Но это имеет смысл только в том случае, если есть какая-то связь между сервисом и парой моделей, сохраненных в одном и том же SecurityMargin. В противном случае рассмотрите возможность использования отдельных таблиц security_margin_service и security_margin_model.
Мне все еще было интересно, не лучше ли вместо этого создать «вставку» @Query для таблицы ServiceModel. При сохранении вызова SecurityMargin также эта вставка в транзакцию.
Спасибо за Ваш ответ! Да, это решение, которое я собираюсь реализовать, хотя я надеялся, что есть какой-то магический трюк, чтобы избежать этого :-) Да, связь между сервисом и моделью не позволяет использовать разные таблицы соединений.