在多对多休眠中覆盖的关系表数据

时间:2018-04-27 23:27:38

标签: java hibernate many-to-many hibernate-mapping persistent

我有两个实体类订单和产品具有多对多关系(多个订单可能具有相同的产品,只要库存不为空,订单可能包含多个产品),如下所示:

@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;
.......
}

以下是用于插入订单和产品的Dao。产品是预定义的,我只需要更新它们的数量。订单将作为新订单插入。必须生成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 :(得分:1)

通过正确识别所有者实体并进行如下更改来实现它:

windowPane.setOnMouseMoved(new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent event) {

        /**move Paddle with mouse *@author Can @author SziSzi */

        paddle.setLayoutX(event.getY());
        paddle.setLayoutX(event.getX()- paddle.getWidth()/2);

    }
});