繁体   English   中英

Hibernate Session Factory

[英]Hibernate Session Factory

在我们的Web应用程序中,我们有一个HibernateSessionFactory类,即打开和关闭连接。 一切都很好,但是当我们更新数据库中的数据时,它在我们的应用程序中不会改变。 不幸的是,我们从数据库中看到旧数据。 我该如何解决?

public class HibernateSessionFactory {

    private static final ThreadLocal threadLocal = new ThreadLocal();
    private static org.hibernate.SessionFactory sessionFactory;

    private static Configuration configuration = new Configuration();
    private static ServiceRegistry serviceRegistry; 

    private static final Logger log = Logger.getLogger(HibernateSessionFactory.class);

    static {
        try {
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
            . buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            log.error("Error Creating SessionFactory",e);

        }
    }

    private HibernateSessionFactory() {
    }

    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get(); 
        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
            : null;

            threadLocal.set(session);
        }
        return session;
    }

    public static void rebuildSessionFactory() {

        try {
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()) 
            .buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            log.error("Error Creating SessionFactory",e);
        }
    }

    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
            session.flush();
            session.close();

        }
    }

    public static org.hibernate.SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Configuration getConfiguration() {
        return configuration;
    }

}

Hibernate是一个软化且复杂的框架,用于在程序和数据库之间构建一个层,提供面向对象的模型来帮助面向对象的程序。

为了做到这一点,并且当然是更好的格式,它创建了一个缓存,以某种方式存储来自数据库或转发到数据库的一些数据。

我认为这个问题不是关于与数据库的连接,而是关于如何保存和检索数据。 我将尝试更好地解释自己:当您查询数据库以保存数据时,您执行以下步骤:

  1. 公开会议
  2. 开放交易
  3. 构建对象
  4. 在会话中刷新并保存对象
  5. 提交事务
  6. 关闭交易
  7. 关闭会议

例如

public Boolean saveNewCliente(Cliente c) {
    Session s = getSession();
    Transaction t = null;
    try {
        t = s.beginTransaction();
        s.save(c);
        s.flush();
        t.commit();
        s.close();
        return true;
    } catch (Exception e) {
         if (t!=null) t.rollback();
        System.out.println(e.getMessage());
        return false;
    }
    finally{
        s.close();
    }

}

当您查询数据库以获取数据时,会发生一个常见的陷阱,就是将与事务相关的部分保留在“查询”步骤之外。 同样需要保存数据

  1. 公开会议
  2. 开放交易
  3. 构建查询/标准
  4. 执行会话查询
  5. 关闭交易
  6. 关闭会议

如果不遵循此步骤,则可能是应用程序中存在过时数据,但数据库中没有。 检查可以是执行更新/保存查询,如果数据已更改/创建,则在数据库中手动检查。 如果您的应用程序然后加载陈旧数据,您知道您以错误的方式执行获取查询(不使用事务)。 这是一个例子

    public Cliente get(Integer id) {
    Session s = getSession();
    Transaction tx = s.beginTransaction();
    try {
        System.out.println("get cliente by id");
        Cliente res = new Cliente();
        res = (Cliente) s.get(Cliente.class, id);
        tx.commit();
        return res;
    } catch (Exception e) {
        tx.rollback();
        System.out.println(e.getMessage());
        return null;
    }finally{
        s.close();
    }
}

如果你想进一步研究你可以通过hibernate暂停缓存的使用,你可以通过以下方式完成它,但请记住,如果数据被缓存,则有一个原因;)这可以作为快速测试以便继续在发现错误是否是由于错误的查询使用。

你应该将它添加到你的hibernate config xml中

<!-- to disable cache -->
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM