С учетом следующих 3 основных таблиц:
- Тендер - первичный ключ 'id' и некоторые дополнительные столбцы
- Товар - первичный ключ 'id' и некоторые дополнительные столбцы
- Страхование - первичный ключ 'id' и некоторые дополнительные столбцы
Теперь рассмотрим следующие таблицы соединений с именами столбцов, ссылающихся на соответствующие таблицы master / join:
- Tender_Commodity - первичный ключ "id" и внешние ключи "Tender" и "Commodity"
- Tender_Commodity_Insurance - первичный ключ "id" и внешние ключи "Insurance" и "Tender_Commodity"
Я просто не могу понять, как представить это в Spring Boot (Java) с Hibernate.
- Пробовали использовать составные ключи с @ Embeddable
- Пробовали ManyToMany с предоставлением @JoinTable и @JoinColumns соответственно
- Попробовал также несколько других вариантов, но я предположил, что вышеперечисленные два сработали бы.
Для простоты я вставил код варианта 2 выше
public class Tender {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
//Omitted other attributes for brevity
@JsonIgnore
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "tender_commodity", joinColumns = @JoinColumn(name = "tender", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "commodity", referencedColumnName = "id"))
private Set<Commodity> commodity;
}
public class Commodity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
//Omitted other attributes for brevity
}
public class TenderCommodity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "commodity")
private Commodity commodity;
@ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "tender")
private Tender tender;
}
public class TenderCommodityInsurance {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "insurance")
private Insurance insurance;
@ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinColumns({
@JoinColumn(name = "tender", referencedColumnName = "tender"),
@JoinColumn(name = "commodity", referencedColumnName = "commodity")
})
private TenderCommodity tenderCommodity;
}
У меня были различные сообщения об ошибках с вышеуказанными реализациями в диапазоне от:
- java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: левая и правая части двоичного логического оператора были несовместимы
- Внешний ключ должен иметь то же количество столбцов, что и первичный ключ, на который ссылаются, для сопоставления многотоновых чисел