Struts + Hibernate:@SessionTarget 不工作
Posted
技术标签:
【中文标题】Struts + Hibernate:@SessionTarget 不工作【英文标题】:Struts + Hibernate: @SessionTarget not working 【发布时间】:2014-04-28 06:45:41 【问题描述】:我正在使用struts2-fullhibernatecore-plugin-2.2.2-GA.jar
在我的 DAO 类中注入 session
,如下所示:
public class UserDAO
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
public List<User> getUsers()
return session.createQuery("from user").list();
但我得到了
java.lang.NullPointerException
com.wudi.DAO.UserDAO.getUsers(UserDAO.java:28)
com.wudi.action.UserListAction.execute(UserListAction.java:24)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
...
根据调试输出,UserDAO
中的session
和transaction
是null
。
一些文件供参考:
User.java
:
@Entity
@Table(name = "user")
public class User implements Serializable
@Id
@GeneratedValue
private int id;
@Column
private String name;
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;
UserListAction.java
:
public class UserListAction extends ActionSupport
private List<User> users;
private UserDAO userDAO = new UserDAO();
@Override
public String execute() throws Exception
users = userDAO.getUsers();
return SUCCESS;
hibernate.cfg.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.mysqlDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sample?zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.pool_size">10</property>
<mapping class="com.wudi.model.User" />
</session-factory>
</hibernate-configuration>
【问题讨论】:
【参考方案1】:如果你想使用 Hibernate Session 和 Transaction 注入能力,你的动作映射包需要扩展包hibernate-default
。
更多关于hibernate-default
包的细节
该插件提供了一个名为hibernate-default
的映射包。这具有三个用于注入功能的拦截器堆栈:
basicStackHibernate
:类似于 Struts2basickStack
(无验证!),但具有 Hibernate 会话和事务注入功能。
defaultStackHibernate
:类似于 Struts2 defaultStack
,但没有 Struts2 验证方法(注释和 XML)。改用 Hibernate Validation 框架。
defaultStackHibernateStrutsValidation
: Struts2 defaultStack
+ 插件的basicStackHibernate
。
此包扩展了hibernate-default
包,因此如果您需要,可以使用所有默认的 Struts2 配置。
hibernate-default
包是抽象的,所以你可以用其他的扩展它。例如:
<package name="default" extends="hibernate-default,json-default" >
要将hibernate-default
与注释配置一起使用,请使用
@ParentPackage("hibernate-default")
@InterceptorRef("basicStackHibernate")
public class YourAction extends ActionSupport
【讨论】:
以上是关于Struts + Hibernate:@SessionTarget 不工作的主要内容,如果未能解决你的问题,请参考以下文章
Struts+Hibernate+Spring面试题合集及答案
struts2集成Spring,Hibernate的问题!!
Struts + Hibernate:@SessionTarget 不工作