org.springframework.transaction.CannotCreateTransactionException

时间:2014-12-21 07:47:45

标签: java spring hibernate jpa

我在尝试调用服务类时收到以下错误


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

我的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" />

服务

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();
    }

}

和我在呼叫队列的控制器

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";
    }

}

2 个答案:

答案 0 :(得分:0)

我可以看到代码中需要做一些改进。

1.为什么注释QueueService课程的@Component@Repository@Service注释都在一起,根据其中包含的代码,它只能注明@Repository

2.您已在类级别使用@Transactional注释,将其从此类中的单个方法中删除。

3.在servlet-context.xml文件中,您有以下行

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

确保您应该正确配置它,它应该扫描spring托管组件,而不是数据库实体,因为根据您的servlet-context.xml文件,"com.plm.conn.model"是您的实体包(请参阅{{ 1}})

答案 1 :(得分:-1)

我希望在没有persistence.xml文件的情况下保留数据。这就是我使用com.plm.conn.model

中的Queue.java实体类的原因

我是Spring的新手我了解到我们可以在不使用持久化类的情况下持久保存数据。我修改了servlet-context.xml,如下所示

&#13;
&#13;
<!-- 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" />
&#13;
&#13;
&#13;

和这里的Queue.java文件

&#13;
&#13;
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;
	}

}
&#13;
&#13;
&#13;

我可以查询表格,但我无法存储数据,我收到错误:

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)