gpt4 book ai didi

java - hibernate session 处理

转载 作者:行者123 更新时间:2023-11-30 07:06:06 26 4
gpt4 key购买 nike

我正在尝试学习 hibernate 和 wicket。我实际上不确定何时打开和关闭 hibernate session 。我搜索了很多并阅读了很多关于 session 工厂的内容,但我仍然不明白。

我想获取我的数据库的一些数据并将其显示在浏览器的表格中。如果我是第一次访问该站点,这实际上是有效的,但是如果我使用后退按钮并再次访问该站点,它会向我显示此错误:

Last cause: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

我认为这是因为我提前关闭了我的 SessionFactory 或类似的东西。但我不知道如何解决这个问题。

我的 Java 类:

public class CategoryPanel extends Panel {
private WebMarkupContainer categoryContainer;
public CategoryPanel(String id) {
super(id);
SessionFactory sessionFactory = DbFactory.getSessionFactory(); // creating the Session Factory
StandardDao<Category> categoryDao = StandardDao.getInstance(sessionFactory); // creating dao to access data
List<Category> categoryList = categoryDao.getAll(Category.class); // get data of the db
CategoryDataProvider dataProvider = new CategoryDataProvider(categoryList);
categoryContainer = new WebMarkupContainer("categoryTable");

final DataView dv = new DataView("categoryList", dataProvider) {

@Override
protected void populateItem(Item item) {
final Category category = (Category) item.getModelObject();
final CompoundPropertyModel<Category> categoryModel = new CompoundPropertyModel<Category>(category);

item.add(new Label("catTitle", categoryModel.bind("title")));
}
};
categoryContainer.add(new Label("categoryTitle", Model.of("Titel")));
add(categoryContainer);
sessionFactory.close(); // here I close the factory, this seems to be wrong. I dont know if i close it anyway..
}
}

我的道:

public class StandardDao<T> {
private static StandardDao instance = null;
private static final Object syncObject = new Object();
private SessionFactory sessionFactory;


private StandardDao(SessionFactory session){
this.sessionFactory = session;
}

public static StandardDao getInstance(SessionFactory session) {
if (instance == null) {
synchronized (syncObject) {
if (instance == null) {
instance = new StandardDao(session);
}
}
}
return instance;
}
public List<T> getAll( Class theClass) {
List<T> entity = null;
Session session = sessionFactory.openSession();
try {
entity = session.createCriteria(theClass).list();
} catch (RuntimeException e) {
e.printStackTrace();
}finally {
session.flush();
// if I close the session here, I cant load lazy
}
return entity;
}
}

最佳答案

您不应关闭 SessionFactory。 SessionFactory 用于返回一个 Session,您可以在该 Session 上工作并且仅关闭该 Session。

此外,您通常不会在 Controller 代码中打开和关闭 session ,而是将此处理委托(delegate)给外部组件,该组件可以在每次请求到达时从 session 工厂打开一个新 session ,最重要的是仅在请求到达时关闭它请求已完成,这意味着 View 部分也已完成其工作。

这种模式通常称为“在 View 中打开 session ”。

在 Java 网络服务器中,这通常使用您在 web.xml 中配置的 servlet 过滤器完成。

在 Google 中搜索 Java Open Session in View 过滤器,您会发现大量示例和解释。

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

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