Hibernate - получить неправильные объекты из моих таблиц примеров. Похоже, что столбцы таблицы «поменялись» - PullRequest
0 голосов
/ 04 сентября 2018

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

table_article (a_id int, description varchar(255))

a_id   description  
1      fish         
2      fish         
3      water

table_customer (customer_id int, name varchar(255)

customer_id   name  
1      john         
2      jane         
3      jack 

ac_join_table (a_id, customer_id, amount, pk(a_id, customer_id))

a_id   customer_id amount  
1      2           10   
2      1           3        
2      3           7   
2      2           18        
3      1           5       

Таким образом, клиент Джейн с идентификатором 2 покупает 10 рыб. Если я запускаю свою программу, похоже, что столбцы таблицы из таблицы объединения интерпретируются по-разному или обмениваются. Потому что, если я запускаю следующий код, Джейн покупает 3 рыбы, 18 рыб и 7 рыб. Похоже, article_id интерпретируется как customer_id, если я запускаю:

// should return that jane (customer_id: 2) buys 10 fishes (a_id: 1, amount: 10)
// but it interprets a_id as customer_id so jane buys 3, 7 and 18 fishes...

Cust c = sessionObj.get(Cust.class, 2); 
List<ArtCustJoin> articles = c.getArtikel();
for (ArtCustJoin artCustJoin : articles) {
     System.out.println(artCustJoin.getArt().getDescription());
}

Мои классы 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
    // ...
}

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;

    // getter + setter
    // ...
}

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() {}
    // ...
}

Я не знаю, где ошибка в том, что столбец a_id интерпретируется как customer_id ...

1 Ответ

0 голосов
/ 04 сентября 2018

Я не Java-разработчик, но оба @OneToMany(mappedBy= кажутся странными и выглядят как причина проблемы. Разве Customer не должен быть сопоставлен с ArtCustJoin с помощью customer_id? вместо @OneToMany(mappedBy="art"). То же относится и к Art классу.

...