【问题标题】:is there a Session variable in Hibernate or Java similar to PHP $_SESSIONHibernate 或 Java 中是否有类似于 PHP $_SESSION 的 Session 变量
【发布时间】:2017-03-24 00:24:34
【问题描述】:

我正在使用 JavaFX+Hibernate 创建桌面应用程序,但是在用户使用他/她的 用户名 登录后,我希望将用户名分配给类似于 PHP @ 的全局变量987654321@ 可以从任何地方访问的变量。

这是我的 HibernateUtil.java 类的代码

package models;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    public static SessionFactory buildSessionFactory(){

     try{
        // Create the SessionFactory from hibernate.cfg.xml
         System.out.println("creating SessionFactory using HibernateUtil.java");
         SessionFactory f = new Configuration().configure().buildSessionFactory();
         System.out.println("session created successfully");
         return f;
     } catch (Throwable ex){
        // Make sure you log the exception, as it might be swallowed
         System.err.println("Initial SessionFactory creation failed." + ex);
         throw new ExceptionInInitializerError(ex);  

     }

    }

 public static SessionFactory getSessionFactory() {
        return sessionFactory;
 }

}

【问题讨论】:

    标签: java hibernate session javafx hql


    【解决方案1】:

    Java 的“全局变量”等价物可能是public 可访问的静态变量。你可以在你的代码中创建一个

     public class Globals {
         public static String userName;
     }
    

    并且可以从Globals.userName设置和读取用户名。

    注意:使用private 字段和getset 方法会更干净......

    【讨论】:

    • 这是不好的做法,可能不应该在这里建议,即使您提供了警告。
    • 我认为这个答案是肯定的,因为它回答了 Java 中 PHP 中 $_SESSION 的替代方案,但我将使用依赖注入或使用私有变量创建自己的方法。
    【解决方案2】:

    不要使用“全局数据”。相反,只需安排将用户名(和其他数据)传递给需要访问它的任何人。 (换句话说,以某种形式使用依赖注入。)

    全局数据的一个(许多)问题是您将自己限制为该变量只有一个值。假设几个月后你的老板来到你的办公室,说“我们的客户喜欢你写的应用程序,但他们中的许多人有多个帐户,他们想同时访问。你能调整应用程序,以便他们可以打开多个标签并在不同的标签中登录每个帐户?”。 (这种情况可能不适用于您,但一般原则适用。)如果您在应用程序中将用户名设置为单个全局变量,则几乎不可能在不重写任意大部分代码的情况下进行此更改。

    见,例如http://wiki.c2.com/?GlobalVariablesAreBadhttps://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil 以及许多其他您可以搜索的内容,出于其他原因不要这样做。

    【讨论】:

    • 谢谢詹姆斯,是的,我理解你,但在我的情况下,它是一个桌面应用程序而不是一个网络服务器应用程序,所以“全局变量数据”将存储在客户端计算机 RAM 中,所以全局应该是在我的情况下很好吗?请指教
    • @OsamaAl-Banna 绝对不是。关于全局数据的建议通常适用于软件设计。我建议的假设场景是指桌面应用程序。不要使用全局数据。
    • 如何创建我自己的方法来存储用户名并且用户名变量将是私有的?我认为该应用程序仍然可以处理多个用户吗?
    • 方法将在哪里定义,您的应用程序的其他部分将如何访问它?这是一个好主意(实际上,您正在谈论用 MVC 术语定义模型),但您仍然遇到与开始时相同的问题:您必须将定义这些方法的对象提供给应用程序的其他部分(使用依赖项注射...)。
    【解决方案3】:

    Hibernate Session 和你想的完全不一样。

    只要您有桌面应用程序,您就必须关心需要在内存中保留的内容。如果您想这样命名,您可以创建自己的上下文或“会话”,并保留您需要的内容。

    PHP $_SESSION 的模拟存在于带有 Servlet API 的 J2EE Web 应用程序中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多