gpt4 book ai didi

java - hibernate session 工厂

转载 作者:行者123 更新时间:2023-11-29 01:13:37 25 4
gpt4 key购买 nike

在我们的 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. 开始 session
  2. 开启交易
  3. 构建对象
  4. 刷新并保存 session 中的对象
  5. 提交交易
  6. 完成交易
  7. 结束 session

例如

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. 开始 session
  2. 开启交易
  3. 构建查询/标准
  4. 在 session 中执行查询
  5. 完成交易
  6. 结束 session

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

    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 配置 xml 中

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

关于java - hibernate session 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com