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
Post a Comment