Hibernate - получить все назначенные объекты из объединенной таблицы с дополнительным столбцом (получить товары, купленные клиентом) - PullRequest
0 голосов
/ 30 августа 2018

В моей базе данных sql server 2016 есть три таблицы в качестве примера для приложения Hibernate, которое использует таблицу соединений с дополнительным столбцом для назначения статей, купленных у клиента с определенной суммой. Мои таблицы:

  1. table_article со столбцами a_id (для идентификатора статьи, типа int, первичного ключа) и описания (varchar (255)). Эта таблица содержит статьи (то есть id 1, молоко и id 2 вода)
  2. table_customer со столбцами customer_id (для идентификатора статьи, введите int, первичный ключ) и name (varchar (255), для имени клиента). Эта таблица содержит клиента (т.е. id 1, john)
  3. ac_join_table со столбцами a_id , customer_id (составной первичный ключ и внешние ключи для table_article соответственно для table_customer. Например, я мог бы назначить клиента john с идентификатором 1 к статьям с идентификаторами 2 и 3 и суммой 5 и 6.

Мои классы Java для модели Hibernate:

Art.java для table_article

@Entity
@Table(name="table_article")
public class Art {
    @Id
    @Column(name = "a_id")
    private int article_id;

    @Column
    private String description;
     // …
    @OneToMany(mappedBy="ku")
    private List<ArtCustJoin> customers;     
    // …    
    // getters and setters
    // ...

    public List<ArtCustJoin> getCustomers() {
        return customers;
    }

    public void setCustomers(List<ArtCustJoin> c) {
        this.customers = c;
    }

}

Cust.java для table_customer

@Entity
@Table(name="table_customer")
public class Cust {
    @Id
    private int customer_id;

    @Column
    private String name;

    @OneToMany(mappedBy="art")
    private List<ArtCustJoin> artikel;    
}

ArtCustJoin.java для таблицы соединений ac_join_table. В соединительной таблице есть дополнительный столбец суммы

@Entity
@Table(schema="dbo", name="ac_join_table")
public class ArtCustJoin {

    // Use Compound Key instead of single primitive key
    @EmbeddedId
    CompositeKey id;


    @ManyToOne
    @JoinColumn(name="a_id", columnDefinition="int", foreignKey = @ForeignKey(name = "FK_ARTID"))
    @MapsId("article_id") // maps to attribute with this name in class Artikel
    private Art art;

    @ManyToOne
    @JoinColumn(name="customer_id", foreignKey = @ForeignKey(name = "FK_CUSTID"))
    @MapsId("customer_id") // maps to attribute with this name in class Kunde
    private Cust ku;

    @Column
    private int amount;

    public CompositeKey getId() {
        return id;
    }

    public void setId(CompositeKey id) {
        this.id = id;
    }

    // getter + setter
    // ...

}

И класс для составного ключа

@Embeddable
public class CompositeKey implements Serializable{
    @Column
    private Integer a_id;

    @Column
    private Integer customer_id;

    public CompositeKey() {}
    // ...
}

Теперь я хочу получить все статьи, которые назначены конкретному клиенту, используя объект клиента Джон программно, без использования HQL или собственного SQL-запроса. Но как я мог получить все статьи от Джона? Следующий код возвращает только объекты типа «ArtCustJoin» (то есть таблицу соединений), а не статьи, которые назначены для john в этой таблице.

sessionObj = buildSessionFactory().openSession();

Cust john = sessionObj.get(Cust.class, 1); 
List<ArtCustJoin> articles = john.getArtikel();
for (ArtCustJoin artCustJoin : articles) {
    // I WANT THE ARTICLES AND NOT ArtCustJoin
}
...