2016-02-06 3 views
0

У меня есть два объекта, которые имеют одно или несколько отношений.
Спящий режим, обновляющий один из многих каскадных

Purchase ----------------< lineCommand

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

Здесь DDL как для покупки и lineCommand: LineCommand:

CREATE TABLE purchaseproduct 
(
    idpurchaseproduct serial NOT NULL, 
    idpurchase integer, 
    idproduct integer, 
    qty double precision, 
    price double precision, 
    CONSTRAINT purchaseproduct_pkey PRIMARY KEY (idpurchaseproduct), 
    CONSTRAINT purchaseproduct_idproduct_fkey FOREIGN KEY (idproduct) 
     REFERENCES product (idproduct) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT purchaseproduct_idpurchase_fkey FOREIGN KEY (idpurchase) 
     REFERENCES purchase (idpurchase) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

Покупка:

CREATE TABLE purchase 
    (
     idpurchase serial NOT NULL, 
     code character varying(50), 
     date timestamp without time zone, 
     totalht double precision, 
     tva double precision, 
     totalttc double precision, 
     CONSTRAINT purchase_pkey PRIMARY KEY (idpurchase) 
    ) 

В Pojos: LineCommand

@Entity 
    @Table(name = "purchaseProduct") 
    @Access(AccessType.PROPERTY) 
    public class LineCommand implements Serializable { 


     private LongProperty idPurchaseProduct; 
     private Product product; 
     private Purchase purchase; 
     private DoubleProperty sellPrice = new SimpleDoubleProperty(); 
     private DoubleProperty qty = new SimpleDoubleProperty(); 
     private DoubleProperty subTotal = new SimpleDoubleProperty(); 


     public LineCommand() { 
      this.idPurchaseProduct = new SimpleLongProperty(); 
      this.product = new Product(); 
      this.purchase = new Purchase(); 

      this.sellPrice = new SimpleDoubleProperty(); 
      this.qty = new SimpleDoubleProperty(); 
      this.subTotal = new SimpleDoubleProperty(); 

      NumberBinding subTotalBinding = Bindings.multiply(this.qty, this.sellPrice); 
      subTotal.bind(subTotalBinding); 

     } 

     @Id 
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "purchase_seq_gen") 
     @SequenceGenerator(name = "purchase_seq_gen", sequenceName = "purchaseproduct_idpurchaseproduct_seq", initialValue = 1, allocationSize = 1) 
     @Column(name = "idpurchaseproduct ", unique = true, nullable = false) 
     public long getIdPurchaseProduct() { 
      return idPurchaseProduct.get(); 
     } 

     public LongProperty idPurchaseProductProperty() { 
      return idPurchaseProduct; 
     } 

     public void setIdPurchaseProduct(long idPurchaseProduct) { 
      this.idPurchaseProduct.set(idPurchaseProduct); 
     } 

     @ManyToOne 
     @JoinColumn(name = "idproduct") 
     public Product getProduct() { 
      return product; 
     } 

     public void setProduct(Product product) { 
      this.product = product; 
     } 

     @ManyToOne 
     @JoinColumn(name = "idpurchase") 
     public Purchase getPurchase() { 
      return purchase; 
     } 

     public void setPurchase(Purchase purchase) { 
      this.purchase = purchase; 
     } 


     @Column(name = "price") 
     public double getSellPrice() { 
      return sellPrice.get(); 
     } 

     public DoubleProperty sellPriceProperty() { 
      return sellPrice; 
     } 

     public void setSellPrice(double sellPrice) { 
      this.sellPrice.set(sellPrice); 
     } 

     @Column(name = "qty") 
     public double getQty() { 
      return qty.get(); 
     } 

     public DoubleProperty qtyProperty() { 
      return qty; 
     } 

     public void setQty(double qty) { 
      this.qty.set(qty); 
     } 

     @Transient 
     public double getSubTotal() { 
      return subTotal.get(); 
     } 

     public DoubleProperty subTotalProperty() { 
      return subTotal; 
     } 

     public void setSubTotal(double subTotal) { 
      this.subTotal.set(subTotal); 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj == null) { 
       return false; 
      } else { 
       Product product = ((LineCommand) obj).getProduct(); 
       Purchase purchase = ((LineCommand) obj).getPurchase(); 

       if (this.product.equals(product) && this.purchase.equals(purchase)) 
        return true; 
       else 
        return false; 
      } 
     } 
    } 

Покупка:

@Entity 
@Table(name = "purchase") 
@Access(AccessType.PROPERTY) 
public class Purchase { 
    private LongProperty idPurchase; 
    private StringProperty codePurchase; 
    private ObjectProperty<LocalDate> datePurchase; 
    private DoubleProperty totalHt; 
    private DoubleProperty tva; 
    private DoubleProperty totalTTC; 

    private Set<LineCommand> lineItems = new HashSet<LineCommand>(0); 

    public Purchase() { 
     this.idPurchase = new SimpleLongProperty(); 
     this.codePurchase = new SimpleStringProperty(); 
     this.datePurchase = new SimpleObjectProperty<>(); 
     this.totalHt = new SimpleDoubleProperty(); 
     this.tva = new SimpleDoubleProperty(); 
     this.totalTTC = new SimpleDoubleProperty(); 


    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "purchase_seq_gen") 
    @SequenceGenerator(name = "purchase_seq_gen", sequenceName = "purchase_idpurchase_seq", initialValue = 1, allocationSize = 1) 
    @Column(name = "idpurchase", unique = true, nullable = false) 
    public long getIdPurchase() { 
     return idPurchase.get(); 
    } 

    public LongProperty idPurchaseProperty() { 
     return idPurchase; 
    } 

    public void setIdPurchase(long idPurchase) { 
     this.idPurchase.set(idPurchase); 
    } 

    @Column(name = "code") 
    public String getCodePurchase() { 
     return codePurchase.get(); 
    } 

    public StringProperty codePurchaseProperty() { 
     return codePurchase; 
    } 

    public void setCodePurchase(String codePurchase) { 
     this.codePurchase.set(codePurchase); 
    } 

    @Column(name = "date") 
    @Convert(converter = LocalDatePersistanceConverter.class) 
    public LocalDate getDatePurchase() { 
     return datePurchase.get(); 
    } 

    public ObjectProperty<LocalDate> datePurchaseProperty() { 
     return datePurchase; 
    } 

    public void setDatePurchase(LocalDate datePurchase) { 
     this.datePurchase.set(datePurchase); 
    } 

    @Column(name = "totalHt") 
    public double getTotalHt() { 
     return totalHt.get(); 
    } 

    public DoubleProperty totalHtProperty() { 
     return totalHt; 
    } 

    public void setTotalHt(double totalHt) { 
     this.totalHt.set(totalHt); 
    } 

    @Column(name = "tva") 
    public double getTva() { 
     return tva.get(); 
    } 

    public DoubleProperty tvaProperty() { 
     return tva; 
    } 

    public void setTva(double tva) { 
     this.tva.set(tva); 
    } 

    @Column(name = "totalTTC") 
    public double getTotalTTC() { 
     return totalTTC.get(); 
    } 

    public DoubleProperty totalTTCProperty() { 
     return totalTTC; 
    } 

    public void setTotalTTC(double totalTTC) { 
     this.totalTTC.set(totalTTC); 
    } 


    @OneToMany(mappedBy = "purchase", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    public Set<LineCommand> getLineItems() { 
     return this.lineItems; 
    } 

    public void setLineItems(Set<LineCommand> lineItems) { 
     this.lineItems = lineItems; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } else { 

      if (this.idPurchase.getValue() == ((Purchase) obj).getIdPurchase()) 
       return true; 
      else 
       return false; 
     } 
    } 

} 

И ей, где я performe некоторые обновления с помощью DAO:

Purchase 
    public boolean update(Purchase obj) { 
     try { 
      if (!session.isOpen()) 
       session = DatabaseUtil.getSessionFactory().openSession(); 
      session.beginTransaction(); 

      Purchase purchase = session.get(Purchase.class, obj.getIdPurchase()); 
      purchase.setCodePurchase(obj.getCodePurchase()); 
      purchase.setDatePurchase(obj.getDatePurchase()); 
      purchase.setTotalHt(obj.getTotalHt()); 
      purchase.setTva(obj.getTva()); 
      purchase.setTotalTTC(obj.getTotalTTC()); 
      //purchase.getLineItems().clear(); 
      // Here where i set line items 
      // purchase.setLineItems(obj.getLineItems()); 


      session.getTransaction().commit(); 
      session.close(); 
      return true; 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 

    } 

Примечание: Только родитель будет обновляться, так что обновление не каскадом.

+0

У литиевых линий в параметре 'obj' есть свой набор покупок? –

+0

Да, это так, но мне нужно обработать ситуацию для покупки с помощью отдельных позиций. Так что давайте предположим, что я вернусь к определенной проблеме purachase, у которой есть две позиции, после редактирования я удаляю эти два элемента. Итак, после обновления, я должен получить элемент thoes, удаленный из таблицы базы данных. –

+0

Он работает, когда я обновляю, добавляю новые элементы LineCommand, но когда я удаляю их из списка, hibernate не может их удалить. Или я должен удалить их сам? –

ответ

0

obj.getLineItems() возвращает набор отдельных экземпляров (они не связаны с текущей сессией Hibernate). Самый простой способ решить эту проблему, чтобы объединить Purchase до совершения сделки:

purchase = session.merge(purchase); 

Таким образом, операция объединения будет каскадно связанных LineCommand экземпляров.

+0

Не работает в моем случае, я не знаю, что не так. –

+0

Итак, нет способа преодолеть эту проблему? –

Смежные вопросы