Struts + Hibernate:@SessionTarget无效
我正在使用struts2-fullhibernatecore-plugin-2.2.2-GA.jar
在我的DAO类中注入一个session
,如下所示:
public class UserDAO { @SessionTarget Session session; @TransactionTarget Transaction transaction; public List 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 users; private UserDAO userDAO = new UserDAO(); @Override public String execute() throws Exception { users = userDAO.getUsers(); return SUCCESS; } }
hibernate.cfg.xml
:
org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/sample?zeroDateTimeBehavior=convertToNull root 10
如果要使用Hibernate会话和事务注入function,则操作映射包需要扩展包hibernate-default
。
有关hibernate-default
包的更多细节
该插件提供了一个名为hibernate-default
的映射包。 这有三个拦截器堆栈,用于注入function:
-
basicStackHibernate
:像Struts2basickStack
(无validation!),但具有Hibernate会话和事务注入function。 -
defaultStackHibernate
:与Struts2defaultStack
类似,但没有Struts2validation方法(注释和XML)。 而是使用Hibernatevalidation框架。 -
defaultStackHibernateStrutsValidation
:Struts2defaultStack
+ plugin的basicStackHibernate
。
这个包扩展了hibernate-default
包,因此如果需要,可以使用所有默认的Struts2配置。
hibernate-default
包是抽象的,所以你可以用其他包来扩展它。 例如:
要使用带有注释配置的hibernate-default
@ParentPackage("hibernate-default") @InterceptorRef("basicStackHibernate") public class YourAction extends ActionSupport {}