本文介紹了在多對(duì)多Hibernate中覆蓋的關(guān)系表數(shù)據(jù)的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有兩個(gè)具有多對(duì)多關(guān)系的實(shí)體類Order和Product(如果庫(kù)存不為空,并且一個(gè)訂單可以包含多個(gè)產(chǎn)品,則多個(gè)訂單可以具有相同的產(chǎn)品),如下所示:
@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;
.......
}
下面是用于插入訂單和產(chǎn)品的DAO。產(chǎn)品是預(yù)定義的,我只需要更新它們的數(shù)量。訂單將作為新訂單插入。必須生成PRODUCT_ORDER關(guān)系表,并將數(shù)據(jù)作為主鍵從ORDER和PRODUCT插入。
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();
}
}'
在此場(chǎng)景中,數(shù)據(jù)將正確插入到所有三個(gè)表中。但是當(dāng)我嘗試插入新訂單時(shí),關(guān)系表(即PRODUCT_ORDER)中的數(shù)據(jù)被覆蓋。被覆蓋的記錄是更新數(shù)量的記錄。這是因?yàn)镠ibernate正在從PRODUCT_ORDER中刪除記錄,然后再次插入它。我想要的是不更新PRODUCT_ORDER表,因?yàn)樗遣恍枰摹N抑幌朐贠rder表中插入一條記錄,在product表中更新Quantity,在product_order表中插入order_id和product_id。提前謝謝您。
推薦答案
通過(guò)正確標(biāo)識(shí)所有者實(shí)體并進(jìn)行以下更改使其正常工作:
@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;
.......
}
這篇關(guān)于在多對(duì)多Hibernate中覆蓋的關(guān)系表數(shù)據(jù)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,






