【问题标题】:@SessionTarget,hibernate session is null@SessionTarget,休眠会话为空
【发布时间】:2018-12-14 22:35:40
【问题描述】:

我正在使用 javastruts2hibernate 构建一个简单的 MVC 应用程序。我创建了应用程序的结构使用瓷砖。我希望休眠创建表以继续我的下一个任务。 我相信,在将 JARS 导入我的应用程序及其正确版本时,我有一个误解。当我尝试插入数据时,hibernate 不会创建用户表并告诉我 session 为 null强>。

这是我的代码和导入的 jars。

谢谢!

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.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
         <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/development</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">dothebest</property>
        <property name="connection.pool_size">1</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <!-- <mapping class="com.SchoolManagement.domain.Address" /> -->
        <mapping class="com.SchoolManagement.domain.User" />
    </session-factory>


</hibernate-configuration>

struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="default" extends="hibernate-default,struts-default">

        <result-types>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>

        <action name="home" method="home" class="com.SchoolManagement.action.BaseAction">
            <result name="success" type="tiles">home</result>
        </action>
        <action name="training" method="training" class="com.SchoolManagement.action.BaseAction">
            <result name="success" type="tiles">training</result>
        </action>
         <action name="contact" method="contact" class="com.SchoolManagement.action.BaseAction">
            <result name="success" type="tiles">contact</result>
        </action>
        <action name="listUser" method="list" class="com.SchoolManagement.action.UserAction">
            <result name="success" type="tiles">listmyUser</result>
        </action>
        <action name="saveOrUpdateUser" method="saveOrUpdate" class="com.SchoolManagement.action.UserAction">
            <result name="success" type="tiles">listmyUser</result>
        </action>

</package>

</struts>

UserAction.java

package com.SchoolManagement.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import java.util.ArrayList;
import java.util.List;

import com.SchoolManagement.domain.User;
import com.SchoolManagement.service.UserService;
import com.SchoolManagement.service.UserServiceImpl;

public class UserAction extends ActionSupport implements ModelDriven<User>{

    private static final long serialVersionUID = -6659925652584240539L;

    private User user = new User();
    private List<User> userList = new ArrayList<User>();
    private UserService userService = new UserServiceImpl();



    @Override
    public User getModel() {
        return user;
    }
    /**
     * To save or update user.
     * @return String
     */
    public String saveOrUpdate()
    {   
        userService.saveOrUpdateUser(user);
        return SUCCESS;
    }

    public String list()
    {
        userList = userService.listUser();
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }


}

UserServiceImpl.java

package com.SchoolManagement.service;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.SchoolManagement.domain.User;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;

public class UserServiceImpl implements UserService{

    @SessionTarget
    Session session;

    @TransactionTarget
    Transaction transaction;




    /**
     * Used to save or update a user.
     */
    @Override
    public void saveOrUpdateUser(User user) {
        try {
            session.saveOrUpdate(user);
        } catch (Exception e) {
            transaction.rollback();
            e.printStackTrace();
        }
    }

    /**
     * Used to list all the users.
     */

    @SuppressWarnings("unchecked")
    @Override
    public List<User> listUser() {

        // TODO Auto-generated method stub
        List<User> userList = null;
        System.out.println("1");
        try {
            System.out.println("2");    
            userList = session.createQuery("from User").list();
            System.out.println("3");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userList;
    }

    }

listUser.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Registration Page</title>
<head>
</head>
<body>
<div class="page">

     <s:form action="saveOrUpdateUser">
        <s:push value="user">
            <s:hidden name="id" />
            <s:textfield name="name" label="User Name" />
            <s:textfield name="email" label="Email" />
            <s:submit />
        </s:push>
    </s:form> 


    <s:if test="userList.size() > 0">
        <div class="content">
        <table class="userTable" cellpadding="5px">
            <tr class="even">
                <th>Name</th>
                <th>Email</th>
                <th>Edit</th>
                <th>Delete</th>
            </tr>
            <s:iterator value="userList" status="userStatus">
                <tr
                    class="<s:if test="#userStatus.odd == true ">odd</s:if> <s:else>even</s:else>">
                    <td><s:property value="name" /></td>
                    <td><s:property value="email" /></td>
                    <td>
                    <s:url id="editURL" action="editUser">
                        <s:param name="id" value="%{id}"></s:param>
                    </s:url>
                    <s:a href="%{editURL}">Edit</s:a>
                    </td>
                    <td>
                    <s:url id="deleteURL" action="deleteUser">
                        <s:param name="id" value="%{id}"></s:param>
                    </s:url>
                    <s:a href="%{deleteURL}">Delete</s:a>
                    </td>
                </tr>
            </s:iterator>
        </table>
        </div>
    </s:if>
    </div>

    </body>
    </html>

这是我的罐子

这是错误:

【问题讨论】:

  • 看来你没有使用 Maven 来控制你的传递依赖;我鼓励你不要那样做。虽然它可能是故意的(即混合的 S1/S2 应用程序),但您似乎在那里有一堆 S1 罐子。在任何情况下,我都不建议混合使用不同版本的 S2 jar。
  • @DaveNewton 你是绝对正确的。这是我的情况。首先我试图用 maven 构建应用程序,因为我知道 maven 会解决我的 JARS 混合和兼容性问题,这对于项目。但我不熟悉 maven 并集成到 maven GAE 或 Apache Tomcat Web 服务器。这是一个学校项目,我的时间有限。所以我决定冒着手动导入 Jars 的风险并以这种方式构建应用程序。任务应用程序目前对我来说进展顺利。我最担心的是应用程序最近会在我导入的那么多罐子上给我一个错误。非常感谢!

标签: java hibernate servlets struts2 tiles


【解决方案1】:

对于hibernate核心Session和Transaction注入能力,我们需要使用basicStackHibernate拦截器。

所以将&lt;interceptor-ref name="basicStackHibernate" /&gt; 添加到您的操作中:

<action name="listUser" method="list" class="com.SchoolManagement.action.UserAction">
    <interceptor-ref name="basicStackHibernate" />
    <result name="success" type="tiles">listmyUser</result>
</action>

【讨论】:

  • 非常感谢我的朋友@Spara。你救了我!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2018-09-27
  • 2013-09-14
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多