【问题标题】:hibernate update one to many items set休眠更新一对多项目集
【发布时间】:2014-04-07 21:17:34
【问题描述】:
  • 销售订单实体。

    @Entity
    @Table(name = "sales_orders")
    @IdClass(ReceiptPK.class)
    public class SalesOrders implements Serializable {
    
        public SalesOrders() {
        }
        @Id
        protected Integer receiptID;
        @Id
        protected Integer dateKey;
    
        public SalesOrders(Integer receiptID, Integer dateKey) {
            this.receiptID = receiptID;
            this.dateKey = dateKey;
        }
    //order contains many details
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "salesOrders")
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
    private Set<SalesOrderDetails> orderDetails = new HashSet<SalesOrderDetails>();
    
    public Set<SalesOrderDetails> getOrderDetails() {
        return orderDetails;
    }
    
    public void setOrderDetails(Set<SalesOrderDetails> orderDetails) {
        this.orderDetails = orderDetails;
    }
    // other property ..
    
  • 订单详情实体。

    @Entity
    @Table(name = "sales_order_details")
    public class SalesOrderDetails implements Serializable {
    
        public SalesOrderDetails() {
        }
        private int id;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        // Order holder
        private SalesOrders salesOrders;
    
        @ManyToOne
        @JoinColumns({
            @JoinColumn(name = "order_num", referencedColumnName = "receiptID"),
            @JoinColumn(name = "date_key", referencedColumnName = "dateKey")})
        public SalesOrders getSalesOrders() {
            return salesOrders;
        }
    
        public void setSalesOrders(SalesOrders salesOrders) {
            this.salesOrders = salesOrders;
        }
         // other property ...
    

我的问题:当我尝试删除不影响sales_order_details 的订单商品时。

            SalesOrders saleOrder = (SalesOrders) getSession().get(SalesOrders.class ,new ReceiptPK(receiptID,dateKey));
            saleOrder.getOrderDetails().remove(someDetails);
            getSession().beginTransaction();
            getSession().saveOrUpdate(saleOrder);
            getSession().getTransaction().commit();  

someDetails 没有被删除。

-- 任何帮助将不胜感激...

【问题讨论】:

    标签: java mysql hibernate annotations


    【解决方案1】:

    我认为你必须提交相同的事务。

    getSession().getTransaction().begin();
    getSession().saveOrUpdate(saleOrder);
    getSession().getTransaction().commit();
    

    【讨论】:

    • 感谢您的快速回答,但此解决方案没有帮助,订单项尚未删除...
    • saleOrder.getOrderDetails().remove(someDetails); 放在开始和提交事务之间怎么样?
    【解决方案2】:

    对于双向关联,您应该(必须)始终确保关联设置正确。

    • 不允许直接访问您的收藏。
    • 提供修改的添加和删除方法。

    public Set<SalesOrderDetails> getOrderDetails() {
      //force to use add/remove to ensure consistent object model
      return Collections.unmodifiableSet(orderDetails);
    }
    
    public void addOrderDetails(SalesOrderDetails salesOrderDetails){
     orderDetails.add(salesOrderDetails);
     salesOrderDetails.setSalesOrders(this); //important
    }
    
    public void removeOrderDetails(SalesOrderDetails salesOrderDetails){
     orderDetails.remove(salesOrderDetails);
     salesOrderDetails.setSalesOrder(null); //important
    }
    

    此外,您是否在您的实体上实现了 equals() 和 hashCode(),即当您调用 salesOrder.getOrderDetails().remove(someDetails) 时,实际上是否从集合中删除了任何内容?

    如果您没有在 SalesOrderDetails 上实现 equals() 和 hashCode(),则可能不会。

    最后,您大喊将 OneToMany 映射上的 orphanRemoval 标志设置为 true:

    http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Orphan_Removal_.28JPA_2.0.29

    【讨论】:

    • 感谢您的好笔记,但是当我从 Order 中删除 order detail 时,将 Sales_order_details 上的 order FK 设置为 null BUT 行仍然存在在桌子上,并没有被删除!!。
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多