0

I am getting the below error while trying to call a service class


org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.NullPointerException
    org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
    com.plm.conn.model.QueueService$$EnhancerBySpringCGLIB$$9405c9f4.getAll()
    com.plm.conn.hcontroller.HomeController.home(HomeController.java:67)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

My servlet-context.xml

    <!-- Derby configuration -->
    <beans:bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName"
            value="org.apache.derby.jdbc.ClientDriver" />
        <beans:property name="url"
            value="jdbc:derby://localhost:1527//office;create=false" />
        <beans:property name="username" value="office" />
    </beans:bean>


    <!-- EntityManagerFactory -->
    <beans:bean id="emf"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <beans:property name="jtaDataSource" ref="dataSource" />
        <beans:property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <beans:property name="packagesToScan" value="com.plm.conn.model" />
    </beans:bean>

    <!-- Transaction adapter -->
    <beans:bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <beans:property name="databasePlatform"
            value="org.hibernate.dialect.DerbyDialect" />
        <beans:property name="showSql" value="true" />
        <beans:property name="generateDdl" value="false" />
    </beans:bean>


    <!-- Transaction Manager -->
    <beans:bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <beans:property name="entityManagerFactory" ref="emf" />
        <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>

    <beans:bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <!-- tx:annotation-driven /-->

    <tx:annotation-driven transaction-manager="transactionManager" />

    <context:component-scan base-package="com.plm.conn.model" />

Service

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional
@Component
@Service
public class QueueService implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static final Logger logger = LoggerFactory
            .getLogger(QueueService.class);

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void addQueue(Queue queue) {
          logger.info(" info..."+em.toString());
                  em.persist(queue);
    }

    @Transactional
    public List<Queue> getAll() {
        TypedQuery<Queue> query = em.createNamedQuery("Queue.findAll",
                Queue.class);
        logger.info(" info..." + query.getResultList());
        return query.getResultList();
    }

}

and my controller where i am calling the queue

package com.plm.conn.hcontroller;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.plm.conn.model.Queue;
import com.plm.conn.model.QueueService;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory
            .getLogger(HomeController.class);

    @Autowired
    private QueueService queueSvc;

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = { "/", "/home" }, method = RequestMethod.GET)
    public String home(Locale locale, Model model, HttpServletRequest request,
            HttpServletResponse response) {


        Queue queue = new Queue();
        //queue.setMsgidProd("1212121212");
        //queueSvc.addQueue(queue);

        logger.info(queueSvc.toString());

        model.addAttribute("list", queueSvc.getAll());

        return "home";
    }

}
M. Deinum
  • 115,695
  • 22
  • 220
  • 224
javaspring
  • 11
  • 1
  • 2

2 Answers2

0

I can see some improvement needs to be done in the code.

1.Why you have annotated QueueService class with @Component,@Repository and @Service annotation all together,as per the code it contains,it should be annotated only with @Repository.

2.You have used @Transactional annotation at the class level,remove it from the individual method from this class.

3.In your servlet-context.xml file,you have below line

  <context:component-scan base-package="com.plm.conn.model" />

make sure that you should have configured it correctly,it should scan the spring managed component,not your database entity,because according to your servlet-context.xml file,"com.plm.conn.model" is your entity package(see <beans:property name="packagesToScan" value="com.plm.conn.model" />)

dReAmEr
  • 6,986
  • 7
  • 36
  • 63
  • @M. Deinum yes,but should scan the correct package, because as per his code the controller package is com.plm.conn.hcontroller,which is why i have mentioned this. – dReAmEr Dec 21 '14 at 10:42
  • I removed the comment, didn't make any sense... I should read closer (or maybe not that early before having had a coffee :) ). – M. Deinum Dec 21 '14 at 12:49
-1

I want to persist data without persistence.xml file. this is why I use Queue.java entity class which is in the com.plm.conn.model

I am new to the Spring I learned that we can persist the data without using persistence class. I modified servlet-context.xml as follows

<!-- Derby configuration -->
 <beans:bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <beans:property name="driverClassName"
   value="org.apache.derby.jdbc.ClientDriver" />
  <beans:property name="url"
   value="jdbc:derby://localhost:1527//plmbridge;create=false" />
  <beans:property name="username" value="plmt" />
 </beans:bean>


 <!-- EntityManagerFactory -->
 <beans:bean id="emf"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <beans:property name="dataSource" ref="dataSource" />
  <beans:property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
  <beans:property name="packagesToScan" value="com.plm.conn.model" />
 </beans:bean>

 <!-- Transaction adapter -->
 <beans:bean id="jpaVendorAdapter"
  class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  <beans:property name="databasePlatform"
   value="org.hibernate.dialect.DerbyDialect" />
  <beans:property name="showSql" value="true" />
  <beans:property name="generateDdl" value="false" />
 </beans:bean>


 <!-- Transaction Manager -->
 <beans:bean id="transactionManager"
  class="org.springframework.orm.jpa.JpaTransactionManager">
  <beans:property name="entityManagerFactory" ref="emf" />
  <beans:property name="dataSource" ref="dataSource" />
 </beans:bean>

 <beans:bean
  class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

 <!-- tx:annotation-driven /-->

 <tx:annotation-driven transaction-manager="transactionManager" />

 <context:component-scan base-package="com.plm.conn.model" />

and the Queue.java file here

package com.plm.conn.model;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the QUEUE database table.
 * 
 */
@Entity
@Table(name="QUEUE")
@NamedQuery(name="Queue.findAll", query="SELECT q FROM Queue q")
public class Queue implements Serializable {
 private static final long serialVersionUID = 1L;

 @Id
 @GeneratedValue(strategy=GenerationType.TABLE)
 @Column(name="QUEUE_ID", unique=true, nullable=false)
 private int queueId;

 @Column(length=250)
 private String container;

 private long expiration;

 @Column(nullable=false, length=100)
 private String id;

 @Lob
 private byte[] msg;

 @Column(name="MSGID_PROD", length=250)
 private String msgidProd;

 @Column(name="MSGID_SEQ")
 private long msgidSeq;

 private long priority;

 @Column(length=250)
 private String xid;

 //bi-directional one-to-one association to Completedjob
 @OneToOne(mappedBy="queue")
 private Completedjob completedjob;

 //bi-directional one-to-one association to Failedjob
 @OneToOne(mappedBy="queue")
 private Failedjob failedjob;

 public Queue() {
 }

 public int getQueueId() {
  return this.queueId;
 }

 public void setQueueId(int queueId) {
  this.queueId = queueId;
 }

 public String getContainer() {
  return this.container;
 }

 public void setContainer(String container) {
  this.container = container;
 }

 public long getExpiration() {
  return this.expiration;
 }

 public void setExpiration(long expiration) {
  this.expiration = expiration;
 }

 public String getId() {
  return this.id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public byte[] getMsg() {
  return this.msg;
 }

 public void setMsg(byte[] msg) {
  this.msg = msg;
 }

 public String getMsgidProd() {
  return this.msgidProd;
 }

 public void setMsgidProd(String msgidProd) {
  this.msgidProd = msgidProd;
 }

 public long getMsgidSeq() {
  return this.msgidSeq;
 }

 public void setMsgidSeq(long msgidSeq) {
  this.msgidSeq = msgidSeq;
 }

 public long getPriority() {
  return this.priority;
 }

 public void setPriority(long priority) {
  this.priority = priority;
 }

 public String getXid() {
  return this.xid;
 }

 public void setXid(String xid) {
  this.xid = xid;
 }

 public Completedjob getCompletedjob() {
  return this.completedjob;
 }

 public void setCompletedjob(Completedjob completedjob) {
  this.completedjob = completedjob;
 }

 public Failedjob getFailedjob() {
  return this.failedjob;
 }

 public void setFailedjob(Failedjob failedjob) {
  this.failedjob = failedjob;
 }

}

I am able to query the tables but I cant store the data I get the error:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: error performing isolated work
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

ERROR 42X05: Table/View 'HIBERNATE_SEQUENCES' does not exist.
    org.apache.derby.client.am.ClientStatement.completeSqlca(Unknown Source)
    org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source)
    org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(Unknown Source)
    org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown Source)
    org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown Source)
    org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown Source)
    org.apache.derby.client.am.ClientStatement.readPrepareDescribeOutput(Unknown Source)
    org.apache.derby.client.am.ClientPreparedStatement.readPrepareDescribeInputOutput(Unknown Source)
    org.apache.derby.client.am.ClientPreparedStatement.flowPrepareDescribeInputOutput(Unknown Source)
    org.apache.derby.client.am.ClientPreparedStatement.prepare(Unknown Source)
    org.apache.derby.client.am.ClientConnection.prepareStatementX(Unknown Source)
    org.apache.derby.client.am.ClientConnection.prepareStatement(Unknown Source)
    org.hibernate.id.MultipleHiLoPerTableGenerator.prepareStatement(MultipleHiLoPerTableGenerator.java:243)
    org.hibernate.id.MultipleHiLoPerTableGenerator.access$200(MultipleHiLoPerTableGenerator.java:86)
    org.hibernate.id.MultipleHiLoPerTableGenerator$1.execute(MultipleHiLoPerTableGenerator.java:159)
    org.hibernate.id.MultipleHiLoPerTableGenerator$1.execute(MultipleHiLoPerTableGenerator.java:152)
    org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:72)
    org.hibernate.jdbc.AbstractReturningWork.accept(AbstractReturningWork.java:51)
    org.hibernate.engine.transaction.internal.jdbc.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:74)
    org.hibernate.id.MultipleHiLoPerTableGenerator$2.getNextValue(MultipleHiLoPerTableGenerator.java:221)
    org.hibernate.id.enhanced.LegacyHiLoAlgorithmOptimizer.generate(LegacyHiLoAlgorithmOptimizer.java:77)
    org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:218)
    org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84)
    org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206)
    org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)
    org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
    org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
    org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
    org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:291)
    com.sun.proxy.$Proxy33.persist(Unknown Source)
    com.plm.conn.model.QueueService.addQueue(QueueService.java:37)
    com.plm.conn.model.QueueService$$FastClassBySpringCGLIB$$6b3c7d41.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
    com.plm.conn.model.QueueService$$EnhancerBySpringCGLIB$$77572cff.addQueue(<generated>)
    com.plm.conn.hcontroller.HomeController.home(HomeController.java:63)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Rizier123
  • 58,877
  • 16
  • 101
  • 156
javaspring
  • 11
  • 1
  • 2
  • This error is due to @GeneratedValue(strategy=GenerationType.TABLE), you need to have table which Hibernate would use to manage the sequences of primary keys. – Michal Dec 21 '14 at 16:04
  • Using hbm2ddl as of http://stackoverflow.com/questions/438146/hibernate-hbm2ddl-auto-possible-values-and-what-they-do might help to get the table created. – Michal Dec 21 '14 at 16:13