在getSession()保存(实体)时获取java.lang.NullPointerException;
我想添加对象数据并想保存在DB表中,一切正常,但它给了我一个错误:在getSession()保存(实体)时获取java.lang.NullPointerException;,java,hibernate,spring-mvc,nullpointerexception,Java,Hibernate,Spring Mvc,Nullpointerexception,我想添加对象数据并想保存在DB表中,一切正常,但它给了我一个错误: java.lang.NullPointerException 联机getSession().save(实体) 我在代码中调用了此方法: @Service public class AddCategoryProcessor implements ICommandProcessor<AddCategory> { @Autowired private IPatronCategoryRepository p
java.lang.NullPointerException
联机getSession().save(实体)代码>
我在代码中调用了此方法:
@Service
public class AddCategoryProcessor implements ICommandProcessor<AddCategory> {
@Autowired
private IPatronCategoryRepository patronCategoryRepository = new PatronCategoryRepository();
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void Process(AddCategory command){
PatronCategory entity = new PatronCategory();
entity.setCategoryName(command.getCategoryName());
try
{
patronCategoryRepository.save(entity);
}catch (Exception e){
e.printStackTrace();
}
}
}
以下是sessionFactory声明:
protected SessionFactory sessionFactory;
猜猜为什么是NULLPOINTEREXCEPTION
更新:
java.lang.NullPointerException
at com.ngl.commandprocessors.patroncategoryprocessor.AddCategoryProcessor.Process(AddCategoryProcessor.java:32)
at com.ngl.commandprocessors.patroncategoryprocessor.AddCategoryProcessor.Process(AddCategoryProcessor.java:16)
at com.ngl.controllerapis.BaseApiController.ProcessRequest(BaseApiController.java:29)
at com.ngl.controllerapis.PatronCategoryController.addCategory(PatronCategoryController.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:746)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:687)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
您的配置有点不完整。您应该将会话管理完全委托给Spring
在spring xml文件中添加:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
在AddCategoryProcessor中,保留存储库的定义如下:
@Autowired
private IPatronCategoryRepository patronCategoryRepository;
@Autowired
private IPatronCategoryRepository patronCategoryRepository;
最后是你的方法:
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void Process(AddCategory command){
PatronCategory entity = new PatronCategory();
entity.setCategoryName(command.getCategoryName());
try
{
getHibernateTemplate.save(entity);
}catch (Exception e){
e.printStackTrace();
}
}
如果您仍然需要直接访问SessionFactory,那么您唯一需要做的就是将其注入到PatronCategoryRepository中:
@Repository
public class PatronCategoryRepository implements IPatronCategoryRepository{
@Autowired
protected SessionFactory sessionFactory;
public PatronCategoryRepository() {
}
public PatronCategory save(PatronCategory entity){
return getSession().save(entity);
}
private Session getSession() {
return sessionFactory.getCurrentSession();
}
}
记住从AddCategoryProcessor中删除新子句,如下所示:
@Autowired
private IPatronCategoryRepository patronCategoryRepository;
@Autowired
private IPatronCategoryRepository patronCategoryRepository;
Employee.java
包com.javacodegeks.snippets.enterprise.model;
导入java.io.Serializable;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.Id;
导入javax.persistence.Table;
@实体
@表(name=“Employee1”)
公共类Employee实现了可序列化{
@身份证
@列(name=“ID”)
私有int-id;
@列(name=“name”)
私有字符串名称;
@列(name=“AGE”)
私人互联网;
公职人员(){
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共长假{
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
}
EmployeeDao.java
包com.javacodegeks.snippets.enterprise.dao;
导入com.javacodegeks.snippets.enterprise.model.Employee;
公共界面EmployeeDAO{
公共作废保存员工(员工员工);
员工findEmployeeById(内部id);
作废更新员工(员工);
作废删除员工(员工);
}
EmployeeDaoImpl.java
包com.javacodegeks.snippets.enterprise.dao;
导入java.io.Serializable;
导入org.hibernate.SessionException;
导入org.hibernate.SessionFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Repository;
导入org.springframework.orm.hibernate3.HibernateTemplate;
导入com.javacodegeks.snippets.enterprise.model.Employee;
公共类EmployeeDAOImpl实现EmployeeDAO{
私有HibernateTemplate模板;
私人会话工厂会话工厂;
@自动连线
公共void setTemplate(HibernateTemplate模板){
this.template=模板;
//模板.setSessionFactory(sessionFactory);
}
public void setSessionFactory(SessionFactory SessionFactory){
新HibernateTemplate(sessionFactory);
}
/*
*公共作废保存员工(员工员工){
*sessionFactory.getCurrentSession().save(员工);
*
* }
*/
公共雇员findEmployeeById(内部id){
return(Employee)sessionFactory.getCurrentSession().get(
Employee.class,id);
}
public void updateEmployee(员工){
sessionFactory.getCurrentSession().update(员工);
}
公共作废删除员工(员工){
sessionFactory.getCurrentSession().delete(员工);
}
公共作废保存员工(员工员工){
sessionFactory.getCurrentSession().persist(员工);
模板。保存或更新(员工);
}
}
Application COntext.xml
com.javacodegeeks.snippets.enterprise.model.Employee
org.hibernate.dialogue.mysqldialogue
真的
请帮助我:-)
为什么@Autowired private IPatronCategoryRepository赞助人CategoryRepository=新赞助人CategoryRepository();是否创建了新对象?有关StackOverflow的问题可能会对您有所帮助,例如:因为getSessionFactory()
是否为null
?VinayVeluri-是的,我删除了@Autowired,但仍然给了我相同的错误。在服务类级别添加@Transactional当我在用户类别报告中编写保存方法时,它给了我与公共无效保存(最终T实体)的冲突错误
位于存储库类中。您已经创建了从未调用过的主顾类别Repository()
构造函数。无需调用构造函数,bean应该在春季定义xmlOK谢谢先生给我时间,并高兴地通知您,我已经用另一种方法解决了它。我正在一个Factory
文件中创建AddCategoryProcessor
的新实例并返回新对象,然后我对其进行了修改,使其autowire
并返回该对象,因此问题现在已解决,我可以继续我的工作,但感谢您给我的帮助和建议。很高兴和你谈话。。
@Autowired
private IPatronCategoryRepository patronCategoryRepository;
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
@Autowired
protected SessionFactory sessionFactory;
Employee.java
package com.javacodegeeks.snippets.enterprise.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "Employee1")
public class Employee implements Serializable {
@Id
@Column(name = "ID")
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "AGE")
private int age;
public Employee() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
EmployeeDao.java
package com.javacodegeeks.snippets.enterprise.dao;
import com.javacodegeeks.snippets.enterprise.model.Employee;
public interface EmployeeDAO {
public void saveEmployee(Employee employee);
Employee findEmployeeById(int id);
void updateEmployee(Employee employee);
void deleteEmployee(Employee employee);
}
EmployeeDaoImpl.java
package com.javacodegeeks.snippets.enterprise.dao;
import java.io.Serializable;
import org.hibernate.SessionException;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.javacodegeeks.snippets.enterprise.model.Employee;
public class EmployeeDAOImpl implements EmployeeDAO {
private HibernateTemplate template;
private SessionFactory sessionFactory;
@Autowired
public void setTemplate(HibernateTemplate template) {
this.template = template;
// template.setSessionFactory(sessionFactory);
}
public void setSessionFactory(SessionFactory sessionFactory) {
new HibernateTemplate(sessionFactory);
}
/*
* public void saveEmployee(Employee employee) {
* sessionFactory.getCurrentSession().save(employee);
*
* }
*/
public Employee findEmployeeById(int id) {
return (Employee) sessionFactory.getCurrentSession().get(
Employee.class, id);
}
public void updateEmployee(Employee employee) {
sessionFactory.getCurrentSession().update(employee);
}
public void deleteEmployee(Employee employee) {
sessionFactory.getCurrentSession().delete(employee);
}
public void saveEmployee(Employee employee) {
sessionFactory.getCurrentSession().persist(employee);
template.saveOrUpdate(employee);
}
}
Application COntext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<context:component-scan base-package="com.javacodegeeks.snippets.enterprise.*" />
<!-- <tx:annotation-driven/> -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.javacodegeeks.snippets.enterprise.model.Employee</value>
</list>
</property>
<!-- <property name="mappingResources">
<list>
<value>Employee.hbm.xml</value>
</list>
</property> -->
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> -->
<bean id="template" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="d" class="com.javacodegeeks.snippets.enterprise.dao.EmployeeDAOImpl">
<property name="template" ref="template"></property>
</bean>
</beans>
pleas ehelp me :-)