Данные таблицы отношений перезаписываются в режиме «многие ко многим» - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть два класса сущностей Order и Product с отношением «многие ко многим» (у нескольких заказов может быть один и тот же продукт, если запас не пустой, а заказ может содержать несколько продуктов) следующим образом:

@Entity
@Table(name = "Order_")
public class Order implements Serializable {

    .......
@ManyToMany(mappedBy="orders")
private List<Product> products;  
    .......
}

@Entity
@Table(name = "Product")
public class Product implements Serializable {

.......
@ManyToMany
@JoinTable(name = "product_order", 
        joinColumns = { @JoinColumn(referencedColumnName="id") }, 
        inverseJoinColumns = { @JoinColumn(referencedColumnName="id") })
private List <Order> orders;
.......
}

Ниже приводится Дао, которое используется для вставки заказа и продукта. Продукты предварительно определены, и мне нужно только обновить их количество. Заказ должен быть вставлен как новый заказ. Необходимо создать таблицу отношений product_order и вставить данные как первичные ключи из заказа и продукта.

public class OrderDao {

 public static void insertProductOrder(Order order, List <Product> cart, List<Integer> quantity){

    ...............
    session.beginTransaction();

    Query query;

    Product pr;

    List list;

    List <Order> orders = new ArrayList<>();
    orders.add(order);

    for(int i=0;i<cart.size();i++) {

    query = session.createQuery("from Product where id = :pid");
    query.setParameter("pid", cart.get(i).getId());
    list = query.list();
    pr = (Product) list.get(0);

    pr.setQuantity(cart.get(i).getQuantity() - quantity.get(i));

    cart.get(i).setOrders(orders);
    }

    order.setProducts(cart);

    session.save(order);

    session.getTransaction().commit();
 }
}'

При таком сценарии данные правильно вставляются во все три таблицы. Но когда я пытаюсь вставить новый заказ, данные в таблице отношений, т. Е. Product_order, перезаписываются. Запись, которая перезаписывается, является той, которая обновляется для количества. Это связано с тем, что Hibernate удаляет запись из product_order, а затем вставляет ее снова. То, что я хочу, - это не обновление таблицы product_order, поскольку она не нужна. Я просто хочу вставить запись в таблицу заказов, обновить количество в таблице продуктов и вставить order_id и product_id в таблицу product_order. Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2018

Работает, правильно идентифицируя сущность владельца и внося изменения следующим образом:

@Entity
@Table(name = "Order_")
public class Order implements Serializable {
....... 
@ManyToMany
@Cascade({CascadeType.PERSIST})
@JoinTable(name = "product_order", 
        joinColumns = { @JoinColumn(referencedColumnName="id") }, 
        inverseJoinColumns = { @JoinColumn(referencedColumnName="id") })
private List<Product> products;
.......
}


@Entity
@Table(name = "Product")
public class Product implements Serializable {
.......
@Cascade({CascadeType.PERSIST})
@ManyToMany(mappedBy="products")
private List <Order> orders;
.......
}
...