我正在使用Hibernate
而不使用@annotations
我尝试了以下代码:
public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static StandardServiceRegistryBuilder builder;
static {
try {
Configuration configuration = new Configuration().configure();
configuration.configure("hibernate.cfg.xml");
builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
} catch (HibernateException ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
客户代码:
public static void main (String[] args) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> customers = criteria.list();
for (Customer customer : customers) {
//print values
}
session.getTransaction().commit();
session.close();
}
这也是我想知道的重要事情
如果要在客户端HibernateUtil
中创建class
类对象怎么办?
HibernateUtil hibernateUtil = new HibernateUtil();
答案 0 :(得分:0)
您可以参考stackoverflow链接: What are the advantages and disadvantages of creating an Object in static block in Java?。
如果您希望在服务器或应用程序启动时创建SessionFactory,则可以使用静态块。否则,请使用静态方法。您还可以使用枚举创建单例。
答案 1 :(得分:0)
因此,您有两个问题,一个是创建单例的正确方法,另一个是在客户端中创建HibernateUtil实例时会发生什么。
对于第二个问题,如果每个客户端都创建HibernateUtil类的实例,就可以了,因为该变量是静态的。如果一切按计划进行,那么只会有一个Hibernate SessionFactory实例。
至于您是否具有正确的Hibernate SessionFactory单例实现?这是一个很难回答的问题。虽然您的代码看起来不错,但多个类加载器可能会导致单例的各种无法预测的问题。如果单独的类加载器创建一个实例,则您可能有多个单例实例,这是您想要避免的悖论。
使用EJB规范,可以将会话bean标记为单例。如果您使用的是Java Web Profile兼容服务器,我会这样做。如果您使用的是Spring Boot,请使用它们提供的单例功能。如果它是独立的应用程序,请注意特殊的,非单一的SessionFactory行为。