Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

Tags:

In my project I have User, Role, UserRole and BloodGroup entities. Firstly I take List<BloodGroup> from DB and set to User. Then I give User and Role entites to UserRole. After that I insert User to DB, then I try to insert UserRole, but I get an error. When I look to DB, the ID of BloodGroup isn't inserted in User table.

If I choose the first BloodGroup in the list, I get an error. Other options is normal.

I look at the internet, I found cascade = CascadeType.ALL, but this add same data to BloodGroup, which means I have more Arh+ BloodGroup.

The entities:

@Entity @Table(name="USERS") public class User implements Serializable {      private static final long serialVersionUID = 1L;      @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private long userid;      @OneToMany(mappedBy="user")     private List<Userrole> userroles;      //bi-directional many-to-one association to Bloodgroup     @ManyToOne     @JoinColumn(name="BLOODGRUPID")     private Bloodgroup bloodgroup;  } 

@Entity public class Bloodgroup implements Serializable {      private static final long serialVersionUID = 1L;      @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private int bloodgroupid;      private String bloodgroupname;      @OneToMany(mappedBy="bloodgroup")     private List<User> users;  } 

@Entity public class Userrole implements Serializable {      private static final long serialVersionUID = 1L;      @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private long userroleid;      private Timestamp createddate;      private Timestamp deleteddate;      private String isactive;      //bi-directional many-to-one association to Role     @ManyToOne     @JoinColumn(name="ROLEID")     private Role role;      //bi-directional many-to-one association to User     @ManyToOne     @JoinColumn(name="USERID")     private User user;  } 

Controller:

user.setBloodgroup(bloodGroupImpl.getBloodGroupById(bGroup)); user.setUserid(userImpl.insertUserProfile(user)); userRoleImpl.insertUserRole(user,role); 

DAO:

public void insertUserRole(User user, Role role) {     Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();     Userrole uRole = new Userrole();     uRole.setIsactive("1");     uRole.setRole(role);     uRole.setUser(user);             session.save(uRole);     session.flush();         }   public void insertUserProfile(User user) {     Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();     session.save(user); } 

Log:

Hibernate:  insert  into     IU.Userrole     (userroleid, createddate, deleteddate, isactive, ROLEID, USERID)  values     (default, ?, ?, ?, ?, ?)  05.Şub.2012 19:23:29 com.sun.faces.application.ActionListenerImpl processAction SEVERE: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.iu.eblood.model.Bloodgroup javax.faces.el.EvaluationException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.iu.eblood.model.Bloodgroup     at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)     at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)     at javax.faces.component.UICommand.broadcast(UICommand.java:315)     at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)     at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)     at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)     at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:103)     at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)     at java.lang.Thread.run(Thread.java:662) 
like image 423
eaktas Avatar asked Feb 05 '12 13:02

eaktas


People also ask

How do you fix the Hibernate object references an unsaved transient instance save the transient instance before flushing error?

By providing @OneToMany(cascade = {CascadeType. ALL}) , it tells Hibernate to save them to the database while saving the parent object. Save this answer.

What is transient instance in Java?

1. Transient State: A New instance of a persistent class which is not associated with a Session, has no representation in the database and no identifier value is considered transient by Hibernate: UserDetail user = new UserDetail(); user.setUserName("Dinesh Rajput"); // user is in a transient state.


1 Answers

your issue will be resolved by properly defining cascading depedencies or by saving the referenced entities before saving the entity that references. Defining cascading is really tricky to get right because of all the subtle variations in how they are used.

Here is how you can define cascades:

@Entity public class Userrole implements Serializable {      private static final long serialVersionUID = 1L;      @Id     @GeneratedValue(strategy=GenerationType.AUTO)     private long userroleid;      private Timestamp createddate;      private Timestamp deleteddate;      private String isactive;      //bi-directional many-to-one association to Role     @ManyToOne(cascade = CascadeType.ALL)     @JoinColumn(name="ROLEID")     private Role role;      //bi-directional many-to-one association to User     @ManyToOne(cascade = CascadeType.ALL)     @JoinColumn(name="USERID")     private User user;  } 

In this scenario, every time you save, update, delete, etc Userrole, the assocaited Role and User will also be saved, updated...

Again, if your use case demands that you do not modify User or Role when updating Userrole, then simply save User or Role before modifying Userrole

Additionally, bidirectional relationships have a one-way ownership. In this case, User owns Bloodgroup. Therefore, cascades will only proceed from User -> Bloodgroup. Again, you need to save User into the database (attach it or make it non-transient) in order to associate it with Bloodgroup.

like image 142
John Ericksen Avatar answered Sep 20 '22 14:09

John Ericksen