Win a copy of Programmer's Guide to Java SE 8 Oracle Certified Associate (OCA) this week in the OCAJP forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

session.save(Object myPojo) is not working

 
Pankaj Patro
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi,

Currently I am facing this problem, when I am trying to insert a record to my existing underlying data base, through EJB->Hibernate,it is not working.

See the code:-

### THIS part is for creating a SessionFactory ######
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}


------

### This part for creating a record #####

public void createGroups(GroupsPOJO mypojo)
{

Transaction tx=null;
try {
Session session = sessionFactory.openSession();
tx = session.beginTransaction();
Serializable id = session.save(mypojo);
tx.commit();
session.close();
} catch (HibernateException e){
e.printStackTrace();
}

}


The createGroups method is running sucessfuly, but the session.save(mypojo) is not executing.

But in this application retreving is working sucessfully..see below
Session session = sessionFactory.openSession();
// session.beginTransaction();
Criteria crit = session.createCriteria(mypojo.getClass());
Example example = Example.create(pojo);
crit.add(example);
myCollection = crit.list();

is running sucessfully.

Can any help from your side.

Thanks
 
Jonathan Huang
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
If the object you're trying to save is already a persistant or transient object then .save will not work. Try saveOrUpdate. New items are saved while objects that are persistant need to be updated.
 
Pankaj Patro
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Jonathan Huang,

Thanks for your suggestion,
now it is working both session.save(Object) and session.saveOrUpdate(Object)
but I used another call back method session.flush() before session.close().

Is this session.flush() is mandatory to use?
 
pascal betz
Ranch Hand
Posts: 547
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
no. hibernate flushes session before closing when you use transactions. check out the API doc for Session:

Force the Session to flush. Must be called at the end of a unit of work, before commiting the transaction and closing the session (Transaction.commit() calls this method). Flushing is the process of synchronising the underlying persistent store with persistable state held in memory.


pascal
 
nirumagics
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
When we are performing Eaither save() or Update operations we are going to user session.saveOrUpdate(). For just saving we have to use session.save(); and followed by session.flush();
 
Pankaj Patro
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Pascal,

if i use this
Transaction tx = session.beginTransaction();

//System.out.println("IS TRANSACTION "+tx.isActive());
session.save(mypojo);
tx.commit();
session.close();

runs sucessfully, but record is not inserting to data base.
if I call tx.isActive() it throughs null pointer exception.
 
pascal betz
Ranch Hand
Posts: 547
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
@nirumagics: the part i quoted is from hibernate API docs. fkush must be called in any way:
Flushing is the process of synchronising the underlying persistent store with persistable state held in memory

but if you use TX then the commit() will call flush() for you.

and btw: your name does not follow the java ranch naming policy (real name, two parts)
 
pascal betz
Ranch Hand
Posts: 547
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Aryan: if you get null pointer for tx.isActive(), then you would also get null pointer for tx.commit(). so i assume the NPE is somewhere else ?
can you post the stacktrace ?

pascal
 
Pankaj Patro
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
but tx.commit() is not throwing any exception.

This is the exception showing in server(JBoss)

16:42:42,437 ERROR [LogInterceptor] RuntimeException in method: public abstract void com.tomax.ejb.groups.GroupsRemote.create
Groups(com.tomax.domain.groups.GroupsPOJO) throws java.rmi.RemoteException:
java.lang.NullPointerException
at org.hibernate.transaction.CMTTransaction.isActive(CMTTransaction.java:87)
at com.tomax.ejb.groups.GroupsEJB.createGroups(GroupsEJB.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.invocation.Invocation.performCall(Invocation.java:345)
at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:214)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:149)
at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:154)
at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:54)
at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:106)
at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:335)
at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)
at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:153)
at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)
at org.jboss.ejb.Container.invoke(Container.java:873)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)
at org.jboss.invocation.jrmp.server.JRMPInvoker$MBeanServerAction.invoke(JRMPInvoker.java:805)
at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:406)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
 
Khue Nguyen
Greenhorn
Posts: 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
pascal betz wrote:@nirumagics: the part i quoted is from hibernate API docs. fkush must be called in any way:
Flushing is the process of synchronising the underlying persistent store with persistable state held in memory

but if you use TX then the commit() will call flush() for you.

and btw: your name does not follow the java ranch naming policy (real name, two parts)


I have same trouble and tx.commit() doesn't call flush(), after i add flush() before call tx.commit it work.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic