Java 为 Hibernate 4.3 返回 SessionFactory Singleton 对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24155264/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Return SessionFactory Singleton object for Hibernate 4.3
提问by Mandar Pandit
I am using Hibernate 4.3. I am trying to get the SessionFactory
object from a HibernateUtil
class. I am trying to get only one SessionFactory
object for entire application, i.e. Singleton object for application.
我正在使用休眠 4.3。我正在尝试SessionFactory
从HibernateUtil
类中获取对象。我试图SessionFactory
为整个应用程序只获取一个对象,即应用程序的单例对象。
Below is my current code, I want to make it Singleton class.
下面是我当前的代码,我想使它成为 Singleton 类。
HibernateUtil.java
HibernateUtil.java
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static StandardServiceRegistry serviceRegistry;
public static SessionFactory getSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
}
Please suggest or provide sample code for this. Thanks.
请为此提出建议或提供示例代码。谢谢。
采纳答案by Mandar Pandit
As suggested I have made the HibernateUtil.java
class as Singleton.
Find the below code, and please suggest / comment to confirm the correctness of code.
正如建议的那样,我将HibernateUtil.java
课程设置为单身人士。找到下面的代码,请提出建议/评论以确认代码的正确性。
Here is the updated code:
这是更新后的代码:
public class HibernateUtil {
private static HibernateUtil instance = null;
private static SessionFactory sessionFactory;
private static StandardServiceRegistry serviceRegistry;
private HibernateUtil(){
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
public static HibernateUtil getInstance(){
if(instance == null){
instance = new HibernateUtil();
}
return instance;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Please do correction if the code is not correct, and suggest the correct way.
如果代码不正确,请更正,并提出正确的方法。
回答by Antoniossss
Just apply singleton pattern
只需应用单例模式
public class HibernateUtil {
private static StandardServiceRegistry serviceRegistry;
private volatile static SessionFactory INSTANCE = null;
public static SessionFactory getSessionFactory() {
if(INSTANCE==null){
createSessionFactory();
}
return sessionFactory;
}
private synchronized static void createSessionFactory() {
if(INSTANCE!=null){return;}
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
INSTANCE = configuration.buildSessionFactory(serviceRegistry);
}
}
Edit: fixed a comma typo
编辑:修正了一个逗号错字
回答by Bala Venkatesh Koripalli
Rather than making HibernateUtil as singleton.Make SessionFactory as singleton.
而不是将 HibernateUtil 设为单例。将 SessionFactory 设为单例。
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
Configuration configuration = new Configuration();
configuration.configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory=configuration.buildSessionFactory(serviceRegistry);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Advantages of above approach as below
上述方法的优点如下
1.no synchronize code(avoiding locking and unlocking for each method call) 2.no if condition 3.sessionfactory is eagly instantiation.(static block will be executeted only once in class life time) 4.application starup itself you can find errors in configuration files.
1.没有同步代码(避免每个方法调用的锁定和解锁) 2.没有条件 3.sessionfactory是eagly实例化。(静态块将在类生命周期内只执行一次) 4.应用程序启动本身你可以发现错误配置文件。
please suggest/comments on this..
请对此提出建议/意见..
thanks
谢谢