我在尝试调用服务类时收到以下错误
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";
}
}
答案 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
我是Spring的新手我了解到我们可以在不使用持久化类的情况下持久保存数据。我修改了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//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;
和这里的Queue.java文件
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;
我可以查询表格,但我无法存储数据,我收到错误:
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)