java - save working but persist not working in hibernate 4.1.1 -
i trying save data usign hsqldb , using hibernate 4.1.4.final. problem want save data using persist when tried it's showing following error:
org.hibernate.persistentobjectexception: detached entity passed persist: main.java.entity.advocate @ org.hibernate.event.internal.defaultpersisteventlistener.onpersist(defaultpersisteventlistener.java:141) @ org.hibernate.internal.sessionimpl.firepersist(sessionimpl.java:835) @ org.hibernate.internal.sessionimpl.persist(sessionimpl.java:828) @ org.hibernate.engine.spi.cascadingaction$7.cascade(cascadingaction.java:315) @ org.hibernate.engine.internal.cascade.cascadetoone(cascade.java:380) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:323) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascade(cascade.java:165) @ org.hibernate.event.internal.abstractsaveeventlistener.cascadebeforesave(abstractsaveeventlistener.java:423) @ org.hibernate.event.internal.abstractsaveeventlistener.performsaveorreplicate(abstractsaveeventlistener.java:264) @ org.hibernate.event.internal.abstractsaveeventlistener.performsave(abstractsaveeventlistener.java:193) @ org.hibernate.event.internal.abstractsaveeventlistener.savewithgeneratedid(abstractsaveeventlistener.java:126) @ org.hibernate.event.internal.defaultpersisteventlistener.entityistransient(defaultpersisteventlistener.java:208) @ org.hibernate.event.internal.defaultpersisteventlistener.onpersist(defaultpersisteventlistener.java:151) @ org.hibernate.event.internal.defaultpersisteventlistener.onpersist(defaultpersisteventlistener.java:78) @ org.hibernate.internal.sessionimpl.firepersist(sessionimpl.java:844) @ org.hibernate.internal.sessionimpl.persist(sessionimpl.java:819) @ org.hibernate.internal.sessionimpl.persist(sessionimpl.java:823) @ main.java.service.legalservice.registercase(legalservice.java:46) @ main.java.tester.tester.registercase(tester.java:52) @ main.java.tester.tester.main(tester.java:28)
but when use save method worked.so want know how persist , save makes difference? , entity classes serialized.how solve persist error.
here class
package main.java.service; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; import org.hibernate.service.serviceregistry; import org.hibernate.service.serviceregistrybuilder; import main.java.businesstier.caseto; import main.java.entity.advocate; import main.java.entity.case; public class legalservice { configuration configuration = new configuration().configure(); serviceregistry serviceregistry = new serviceregistrybuilder().applysettings( configuration.getproperties()). buildserviceregistry(); sessionfactory sessionfactory = configuration.buildsessionfactory(serviceregistry); public int registercase(caseto caseto) { try { session session; session=sessionfactory.opensession(); session.begintransaction(); case c = new case(); advocate = new advocate(); a.setadvocateid(caseto.getadvocateid()); c.setadvocate(a); c.setclientage(caseto.getclientage()); c.setclientname(caseto.getclientname()); c.setdate(caseto.getdate()); c.setdescription(caseto.getdescription()); session.persist(c); session.gettransaction().commit(); return c.getcaseno(); } catch(exception e){ e.printstacktrace(); return 0; } } }
here entity class advocate.java
package main.java.entity; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.table; import org.hibernate.annotations.dynamicinsert; import org.hibernate.annotations.dynamicupdate; @entity @table(name="db_advocate") @dynamicinsert(value=true) @dynamicupdate(value=true) public class advocate { @id @generatedvalue(strategy=generationtype.identity) @column(name="advocateid") private integer advocateid; @column(name="name") private string name; @column(name="age") private integer age; @column(name="category") private string category; @column(name="court") private string court; @column(name="city") private string city; public integer getadvocateid() { return advocateid; } public void setadvocateid(integer advocateid) { this.advocateid = advocateid; } public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } public string getcategory() { return category; } public void setcategory(string category) { this.category = category; } public string getcourt() { return court; } public void setcourt(string court) { this.court = court; } public string getcity() { return city; } public void setcity(string city) { this.city = city; } }
case.java
package main.java.entity; import java.util.date; import javax.persistence.cascadetype; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone; import javax.persistence.table; import org.hibernate.annotations.dynamicinsert; import org.hibernate.annotations.dynamicupdate; @entity @table(name="db_case") @dynamicinsert(value=true) @dynamicupdate(value=true) public class case { @id @generatedvalue(strategy=generationtype.identity) private integer caseno; @joincolumn(name="advocateid") @manytoone(cascade=cascadetype.all) private advocate advocate; private string clientname; private integer clientage; private string description; private date date; public integer getcaseno() { return caseno; } @column(name="caseno") public void setcaseno(integer caseno) { this.caseno = caseno; } public advocate getadvocate() { return advocate; } public void setadvocate(advocate advocateid) { this.advocate = advocateid; } public string getclientname() { return clientname; } public void setclientname(string clientname) { this.clientname = clientname; } public integer getclientage() { return clientage; } public void setclientage(integer clientage) { this.clientage = clientage; } public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } public date getdate() { return date; } @column(name="data",nullable=true) public void setdate(date date) { this.date = date; } }
first need understand behaviour of persist(). below links understand behaviour whats difference between persist() , save() in hibernate? http://javarevisited.blogspot.in/2012/09/difference-hibernate-save-vs-persist-and-saveorupdate.html
now in order solve problem in code .. use merge() instead of persist().
why persist() gave exception
persist() not work detached objects .you need know how hibernate determines whether object detached or not.
update
why identifier generation strategy auto solved problem
as mentioned above need understand rules hibernate identifies whether object detached or transient. below rule
if the entity has null value identifier or version attribute null considered transient other wise detached.
if use auto-generated identifiers, , identifier not null, hibernate considers detached entity.
if using assigned identifier strategy hibernate issue fetch determine whether identifier exists in db based on entity either transient or detached.
now being said .. analyse code.
in code have advocate entity identifier strategy identity.in below code
case c = new case(); advocate = new advocate(); a.setadvocateid(caseto.getadvocateid());
you setting identifier property of advocate instance manually.at time of flush when transaction commits ,hibernate see identifier generation strategy identity , identifier value set in advocate instance hence conclude entity instance detached (this rule 1 described above).and hence persist() method gave exception advocate instance deemed detached hibernate.
from rule 2 can code not work changing generation strategy auto.you might have done other changes.
i have tried code on system giving same exception if change generation strategy auto in consistent rules
you might doing different in code .. please check , update.
please post identifier setting in advocate , actual identifier generated advocate in database auto generation strategy, might helpful
Comments
Post a Comment