java - Hibernate updating one to many cascaded -


i have 2 entities, have 1 many relationships.

purchase ----------------< linecommand

i have mapped entities together, , works fine @ least when want save or delete purchase, except when perform update, parent (purchase update) , children won't updated.

here ddl both purchase , 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 ) 

purchase:

 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)     ) 

the 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;             }         }     } 

purchase:

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

and performe updates via 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 set line items             // purchase.setlineitems(obj.getlineitems());               session.gettransaction().commit();             session.close();             return true;          } catch (exception e) {             e.printstacktrace();             return false;         }      } 

notice: parent update, update not cascaded.

obj.getlineitems() returns set of detached instances (they not associated current hibernate session). easiest way resolve issue merge purchase before committing transaction:

purchase = session.merge(purchase); 

this way merge operation cascaded associated linecommand instances.


Comments

Popular posts from this blog

routing - AngularJS State management ->load multiple states in one page -

python - GRASS parser() error -

Swift game error message -