Как мне представить отношения «многие ко многим ко многим» в Spring Boot / Hibernate? - PullRequest
0 голосов
/ 21 мая 2019

С учетом следующих 3 основных таблиц:

  1. Тендер - первичный ключ 'id' и некоторые дополнительные столбцы
  2. Товар - первичный ключ 'id' и некоторые дополнительные столбцы
  3. Страхование - первичный ключ 'id' и некоторые дополнительные столбцы

Теперь рассмотрим следующие таблицы соединений с именами столбцов, ссылающихся на соответствующие таблицы master / join:

  1. Tender_Commodity - первичный ключ "id" и внешние ключи "Tender" и "Commodity"
  2. Tender_Commodity_Insurance - первичный ключ "id" и внешние ключи "Insurance" и "Tender_Commodity"

Я просто не могу понять, как представить это в Spring Boot (Java) с Hibernate.

  1. Пробовали использовать составные ключи с @ Embeddable
  2. Пробовали ManyToMany с предоставлением @JoinTable и @JoinColumns соответственно
  3. Попробовал также несколько других вариантов, но я предположил, что вышеперечисленные два сработали бы.

Для простоты я вставил код варианта 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;
}

У меня были различные сообщения об ошибках с вышеуказанными реализациями в диапазоне от:

  1. java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: левая и правая части двоичного логического оператора были несовместимы
  2. Внешний ключ должен иметь то же количество столбцов, что и первичный ключ, на который ссылаются, для сопоставления многотоновых чисел
...