清单5:使用auto-update(自动更新)
后面我们将详细解释其目的,并更多地讲解没有它我们怎样实现。HibernateUtil类有好几种实现方式。由于Hibernate配置文件内容的不同,我们的实现与已知的那些将有一点儿不同。
package com.enterra.customfieldsdemo; import org.hibernate.*; import org.hibernate.mapping.PersistentClass; import org.hibernate.tool.hbm2ddl.SchemaUpdate; import org.hibernate.cfg.Configuration; import com.enterra.customfieldsdemo.domain.Contact; public class HibernateUtil { private static HibernateUtil instance; private Configuration configuration; private SessionFactory sessionFactory; private Session session; public synchronized static HibernateUtil getInstance() { if (instance == null) { instance = new HibernateUtil(); } return instance; } private synchronized SessionFactory getSessionFactory() { if (sessionFactory == null) { sessionFactory = getConfiguration().buildSessionFactory(); } return sessionFactory; } public synchronized Session getCurrentSession() { if (session == null) { session = getSessionFactory().openSession(); session.setFlushMode(FlushMode.COMMIT); System.out.println("session opened."); } return session; } private synchronized Configuration getConfiguration() { if (configuration == null) { System.out.print("configuring Hibernate ... "); try { configuration = new Configuration().configure(); configuration.addClass(Contact.class); System.out.println("ok"); } catch (HibernateException e) { System.out.println("failure"); e.printStackTrace(); } } return configuration; } public void reset() { Session session = getCurrentSession(); if (session != null) { session.flush(); if (session.isOpen()) { System.out.print("closing session ... "); session.close(); System.out.println("ok"); } } SessionFactory sf = getSessionFactory(); if (sf != null) { System.out.print("closing session factory ... "); sf.close(); System.out.println("ok"); } this.configuration = null; this.sessionFactory = null; this.session = null; } public PersistentClass getClassMapping(Class entityClass){ return getConfiguration().getClassMapping(entityClass.getName()); } } |
清单6:HibernateUtils类
除了平常的getCurrentSession()和getConfiguration()方法(这些方法对基于Hibernate的应用的常规操作是很必要的)之外,我们还需要实现像reset()和getClassMapping(Class entityClass)这样的方法。在getConfiguration()方法中,我们配置Hibernate、并将类Contact添加到配置中去。
reset()方法关闭所有Hibernate使用的资源、清除所有的设置:
public void reset() { Session session = getCurrentSession(); if (session != null) { session.flush(); if (session.isOpen()) { System.out.print("closing session ... "); session.close(); System.out.println("ok"); } } SessionFactory sf = getSessionFactory(); if (sf != null) { System.out.print("closing session factory ... "); sf.close(); System.out.println("ok"); } this.configuration = null; this.sessionFactory = null; this.session = null; } |
清单7:reset()方法
getClassMapping(Class entityClass)方法返回PersistentClass对象,该对象包含相关实体映射的全部信息。特别地,对PersistentClass对象的处理允许在运行时修改实体类的属性设置。
public PersistentClass getClassMapping(Class entityClass){ return getConfiguration().getClassMapping(entityClass.getName()); } |