getHibernateTemplate().find()空指针问题

hunter_720 2008-06-20 03:49:52
这个问题很怪.我在Junit下测试我的代码时,getHibernateTemplate().find()没有一点问题.当我把它放到Struts1.2的action下就报空指针异常.
异常如下:
exception
java.lang.NullPointerException
org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
org.hibernate.type.EntityType.resolve(EntityType.java:303)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
org.hibernate.loader.Loader.doQuery(Loader.java:717)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
org.hibernate.loader.Loader.doList(Loader.java:2145)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:836)
com.ace.core.dao.impl.PersonDaoBean.getTPersonByName(PersonDaoBean.java:110)
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.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy7.getTPersonByName(Unknown Source)
com.ace.core.business.impl.PersonManagerBean.login(PersonManagerBean.java:110)
com.ace.core.struts.action.LoginAction.execute(LoginAction.java:53)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

这是我的applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>hibernate.cfg.xml</value>
</property>
</bean>

<!--事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- Dao -->
<bean id="personDao" class="com.ace.core.dao.impl.PersonDaoBean">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
<property name="roleDao">
<ref local="roleDaoProxy"/>
</property>
</bean>
<bean id="roleDao" class="com.ace.core.dao.impl.RoleDaoBean">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- Proxy -->
<bean id="personDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!--实际操作数据的类 -->
<property name="target">
<ref local="personDao"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="change*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="roleDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!--实际操作数据的类 -->
<property name="target">
<ref local="roleDao"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="change*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- Manager -->
<bean id="personManager" class="com.ace.core.business.impl.PersonManagerBean">
<property name="personDao">
<ref local="personDaoProxy"/>
</property>
<property name="roleDao">
<ref local="roleDaoProxy"/>
</property>
</bean>
</beans>
PerManagerBean的Login方法:
public Person login(String name, String password) {
TPerson tPerson = personDao.getTPersonByName(name);
String md5Password = "";
try {
md5Password = MD5HashUtil.hashCode(password);
if(!(tPerson.getPassword().equals(md5Password))){
return null;
}
TRole tRole = tPerson.getTRole();
if(tRole.getId() == 2){
AdminBean admin = getAdminResouce();
admin.setTPerson(tPerson);
return admin;
}else if(tRole.getId() == 3){
UserBean user = getUserResouce();
user.setTPerson(tPerson);
return user;
}else if(tRole.getId() == 1){
SuperAdminBean superAdmin = getSuperAdminResouce();
superAdmin.setTPerson(tPerson);
return superAdmin;
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
PersonDaoBean的getTPersonByName方法:
public TPerson getTPersonByName(String name){
HibernateTemplate ht = getHibernateTemplate();
List list = ht.find("from TPerson tp where tp.name=?",name);
if(list.size() != 0){
TPerson tPerson = (TPerson) list.get(0);
return tPerson;
}else
return null;
}
...全文
448 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunter_720 2008-06-21
  • 打赏
  • 举报
回复
问题解决了.是hibernate的一个bug,我更新cglib到2.2,然后把hbm.xml中一对多的列设置成为lazy="false".这样就OK 了.谢谢大家
whetu 2008-06-20
  • 打赏
  • 举报
回复
com.ace.core.dao.impl.PersonDaoBean.getTPersonByName(PersonDaoBean.java:110)
com.ace.core.business.impl.PersonManagerBean.login(PersonManagerBean.java:110)
你 把这两个文件的的110行代码指出来。
很可能是spring的配置问题。
Shine_Panda 2008-06-20
  • 打赏
  • 举报
回复
可能是你的action中注入的dao 时 出了问题。
你先注释掉操作hibernate的代码看是否还报 NullPointerException
hunter_720 2008-06-20
  • 打赏
  • 举报
回复
很奇怪的是.我在别的地方写的getHibernateTemplete.find在action中可以用,就是这个不能用.真是奇怪
公亮 2008-06-20
  • 打赏
  • 举报
回复
这个null估计是指你getTPersonByName(Unknown Source)
并不是Hibernate这里的问题
hunter_720 2008-06-20
  • 打赏
  • 举报
回复
我现在把这个方式改成用session做也还是报同样的空指针异常:
public TPerson getTPersonByName(String name){
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery("from TPerson tp where tp.name=?");
query.setParameter(0, name);
TPerson tPerson = (TPerson) query.setMaxResults(1).uniqueResult(); //这句报错 return tPerson;
}
hunter_720 2008-06-20
  • 打赏
  • 举报
回复
哦.我以前是按List list = getHibernateTemplate().find("from TPerson tp where tp.name=?",name);这样写的,我写成上面那样是为了看那个HibernateTemplate是否为空.
问题还没解决,关键是我在Junit下测试这段代码没有问题,在action下就有问题了.
谢谢
longtramp 2008-06-20
  • 打赏
  • 举报
回复
find()方法查找的必须是持久化的对象
改成这样试一下
List list = getHibernateTemplate().find("from TPerson tp where tp.name=?",name);
guoxujie 2008-06-20
  • 打赏
  • 举报
回复
PersonDaoBean的getTPersonByName方法:
public TPerson getTPersonByName(String name){
HibernateTemplate ht = getHibernateTemplate();
List list = ht.find("from TPerson tp where tp.name=?",name);
if(list.size() != 0){
TPerson tPerson = (TPerson) list.get(0);
return tPerson;
}else
return null;
}

=================================
红色这行不能这样写。
hunter_720 2008-06-20
  • 打赏
  • 举报
回复
Action的excute方法:

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonManager personManager = (PersonManager) ctx.getBean("personManager");
String userName = request.getParameter("user");
String password = request.getParameter("password");
Person person = personManager.login(userName, password);
if(person == null){
return mapping.findForward("fail");
}else if(person instanceof UserBean){
UserBean user = (UserBean) person;
request.getSession().setAttribute("person", user);
return mapping.findForward("successUser");
}else if(person instanceof AdminBean){
AdminBean admin = (AdminBean) person;
request.getSession().setAttribute("person", admin);
return mapping.findForward("successAdmin");
}else if(person instanceof SuperAdminBean){
SuperAdminBean superAdmin = (SuperAdminBean) person;
request.getSession().setAttribute("person", superAdmin);
return mapping.findForward("successSuperAdmin");
}
return null;
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧