Проблема гибернации, карта с объектом в качестве ключа и целое число в качестве значения - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь добавить функциональность количества товаров в мое приложение для покупок. У меня есть Order объект, который имеет Map , у которого есть ключи, которые являются Case объектами (например, футляр для музыкального оборудования), и значениями, которые они вводят store - это Integer , которые представляют количество этих дел в этом порядке.

Ранее Orders имели только Список из Случаи в отношениях @OneToMany, и они работали нормально, без проблем сохранялись в БД (без количественной функциональности). Объекты Order и Case имеют таблицы и объединяются в двух направлениях.

Теперь я хотел добавить Соединительную таблицу , которая состояла из Order_id, Case_id и количества (дела в заказе). Я видел много примеров, но большинство из них имеют простой ключ и значение как объект (в отличие от того, что у меня есть), и ключ в большинстве случаев ссылается на параметр значения (что не является моим случаем).

В настоящее время я получаю исключение org.hibernate.TransientObjectException, поскольку я не сохраняю объект Case . Я, вероятно, даже не отображаю это правильно. Я довольно растерялся относительно того, как использовать аннотации в моем конкретном случае c. Вот код:

Заказ

@Proxy(lazy=false)  // test
@Table(name="orders")
public class Order {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

//  @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @ElementCollection
    @JoinTable(name="quantities",
        joinColumns = {@JoinColumn(name="order_id", referencedColumnName="id")}
//      ,
//      inverseJoinColumns = {@JoinColumn(name="case_id", referencedColumnName="id")}
        )
    @MapKeyJoinColumn(name="case", referencedColumnName = "id")
    @Column(name="quantity")
    private Map<Case, Integer> cases;

(...)

Корпус

@Proxy(lazy=false)
@Table(name="cases")
public class Case {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

(...)

    @ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE, 
                        CascadeType.DETACH, CascadeType.REFRESH})
    @JoinColumn(name="order_id")
    private Order order;

1 Ответ

0 голосов
/ 11 января 2020

Попробуйте:

Заказ

@Proxy(lazy=false)  // test
@Table(name="orders")
public class Order {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @ElementCollection
    @CollectionTable(name="quantities",
        joinColumns = {@JoinColumn(name="Order_id")}
        )
    @MapKeyJoinColumn(name="Case_id")
    @Column(name="quantity")
    private Map<Case, Integer> cases;

(...)

Дело

@Proxy(lazy=false)
@Table(name="cases")
public class Case {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    (...)

    @ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.MERGE, 
                        CascadeType.DETACH, CascadeType.REFRESH})
    @JoinTable(name="quantities",
        inverseJoinColumns = {@JoinColumn(name="order_id", referencedColumnName="id")}
        ,
        joinColumns = {@JoinColumn(name="case_id", referencedColumnName="id")}
    )
    private List<Order> order;

Источники:

https://docs.oracle.com/javaee/7/api/javax/persistence/MapKeyJoinColumn.html

http://www.java2s.com/Tutorials/Java/JPA/0320__JPA_ElementCollection_MapKeyEntity.htm

...