http://hi.baidu.com/gefforey520/item/ad420ed7544f6d96270ae71c
hibernate只是用来对数据库连接处理的一个中间件,是对jdbc的一个轻量级封装。
hibernate是一种ORM框架,就是面向对象与关系型数据的一个协调框架,让你使用面向对象的思想来访问和操作关系型数据库。hibernate编程需要这样的几个步骤,首先在数据库里要生成一个表tbl;其次要在eclipse下编写一个对应于tbl的类,这种类我们称之为POJO类;其三我们需要在这两者之间架起一个桥梁,也就是用abc.hbm.xml这样的配置文件来联系二者;最后还需要一个hibernate.cfg.xml文件来配置如何连接mysql或其他数据库以及相关的abc.hbm.xml的存放位置。
可以试着用一些像MiddleGen,xDoclet等之类的生成工具,不过我还是偏向手工编写,而且用Hibernate-Tools工具也很方便手写。
这里作一些说明:
src文件夹下除了hibernate.cfg.xml这个配置文件外,其他都是文件夹,这里分别进行说明:
1,hibernate.cfg.xml:配置Java如何链接mysql数据库和xxx.hbm.xml存放位置的配置文件。
2,config文件夹 :放置各个类与表的对应关系的配置文件,因为这里只有PersonInfo一个类和personinfo一个表相对应,所以这里只有一个PersonInfo.hbm.xml配置文件,这个文件会被hibernate.cfg.xml引用。
3,dao文件夹 :这里放置关于DAO的类,DAO的作用是抽象出对使用OO方式对关系型数据库的操作,当然实际上也不是必须的。
比如后面的测试文件Test就演示了如何不用DAO访问数据库。而PersonInfoDaoTest则演示了使用DAO。
其中两个Generic文件我也不知道源自哪里。后面的PersonInfoDao则是专门对PersonInfo类的操作的封装。
4,hibernateSampleTest文件夹:这里放了两个测试类,PersonInfoDaoTest演示了使用DAO方式访问数据库。Test则演示了不用DAO方式访问数据库。
5,pojo文件夹 :pojo中每个文件都对应数据库一个表。比如这边的PersonInfo类是personinfo表的对应类。
另外需要主要还要引用一大堆jar包。
比如;
hibernate3.jar
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
mysql-connector-java-5.1.7-bin.jar//使用的是mysql数据库s
slf4j-nop-1.6.1.jar//注意slf4j-nop-1.6.1.jar和slf4j-api-1.6.1.jar需要版本相同,否则出现可能不兼容的情况。
slf4j-api-1.6.1.jar
在MySql下创建数据库sample,创建表personinfo,主键为INTEGER型pid,属性列有:varchar型pname,INTEGER型age。其sql文件如下:
CREATE TABLE personinfo( pid INTEGER NOT NULL auto_increment PRIMARY KEY, pname VARCHAR(50) NOT NULL, age INTEGER NOT NULL );
mysql> desc personinfo; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | pid | int(11) | NO | PRI | NULL | auto_increment | | pname | varchar(50) | NO | | NULL | | | age | int(11) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
PersonInfo.java
package pojo; public class PersonInfo { private Integer pid; private String pname; private Integer age; public PersonInfo() { super(); } public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "PersonInfo [pid=" + pid + ", pname=" + pname + ", age=" + age + "]"; } }
PersonInfo.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pojo"> <class name="PersonInfo" table="personinfo"> <id name="pid" column="pid" type="java.lang.Integer"> <generator class="native"/> </id> <property name="pname" column="pname" type="java.lang.String" /> <property name="age" column="age" type="java.lang.Integer" /> </class> </hibernate-mapping>
需要放在src目录下。
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">xxx</property> <property name="hibernate.connection.url">jdbc:mysql://10.13.xx.79:3306/sample</property> <property name="hibernate.connection.username">xxx</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.default_entity_mode">pojo</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.search.autoregister_listeners">false</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.default_catalog">sample</property> <!--<property name="hibernate.hbm2ddl.auto">create</property>--> <mapping resource="config/PersonInfo.hbm.xml"/> </session-factory> </hibernate-configuration>
注意其中的<property name="hibernate.hbm2ddl.auto">create</property>表示,如果数据库里没有表的话会自动创建,如果存在,则覆盖之。
GenericDao.java
package dao; import java.io.Serializable; import java.util.Collection; import java.util.List; public abstract interface GenericDao<T, PK extends Serializable> { // public abstract List<T> getAll(); // public abstract List<T> getAllDistinct(); public abstract T findById(PK paramPK); // public abstract boolean exists(PK paramPK); public abstract T save(T paramT); public abstract void saveAllT(Collection<T> paramCollection); public abstract void saveAll(Collection<? extends T> paramCollectio); public abstract void remove(PK paramPK); public abstract void removeByHql(String hql); public abstract void updateByHql(String hql); public abstract List<T> findByHql(String hql); /** * * @Title: findByVersion * @Description: TODO 搜索版本下所有内容 * @return * @return List<T> * @throws */ // public abstract List<T> findByVersion(String hql); public void saveOrUpdateAll(Collection<T> entities); void removeAll(Collection<T> entities); }
package dao; import java.io.Serializable; import java.lang.reflect.Method; import java.util.Collection; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Expression; public class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T, PK> { // 是否插入版号ID protected Method versionIDMethod; // 是否插入项目ID protected Method projectIDMethod; protected static Log log = LogFactory.getLog(GenericDaoHibernate.class); // protected final Log log = LogFactory.getLog(super.getClass()); private Class<T> persistentClass; // private HibernateTemplate hibernateTemplate; private final SessionFactory sessionFactory = getSessionFactory(); protected List<T> objects; public GenericDaoHibernate(Class<T> persistentClass) { this.persistentClass = persistentClass; } /* * public HibernateTemplate getHibernateTemplate() { return * this.hibernateTemplate; } */ protected SessionFactory getSessionFactory() { try { return new Configuration().configure().buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage()); throw new IllegalStateException( "Could not locate SessionFactory in JNDI"); } } public T save(T object) { log.debug("persisting Project instance"); try { sessionFactory.getCurrentSession().beginTransaction(); sessionFactory.getCurrentSession().persist(object); sessionFactory.getCurrentSession().getTransaction().commit(); log.debug("persist successful"); return object; } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("persist failed", re); throw re; } } public void saveAllT(Collection<T> entities) { this.saveAll(entities); } public List<T> findByHql(String hql) { log.debug("finding Project instance by example"); try { sessionFactory.getCurrentSession().beginTransaction(); List<T> results = (List<T>) sessionFactory.getCurrentSession() .createCriteria(persistentClass).add(Expression.sql(hql)) .list(); log.debug("find by example successful, result size: " + results.size()); sessionFactory.getCurrentSession().getTransaction().commit(); return results; } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("find by example failed", re); throw re; } } public T findById(PK id) { log.debug("getting Project instance with id: " + id); try { sessionFactory.getCurrentSession().beginTransaction(); T instance = (T) sessionFactory.getCurrentSession().get( persistentClass, id); sessionFactory.getCurrentSession().getTransaction().commit(); if (instance == null) { log.debug("get successful, no instance found"); } else { log.debug("get successful, instance found"); } return instance; } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("get failed", re); throw re; } } public List<T> findBySql(String sql) { try { sessionFactory.getCurrentSession().beginTransaction(); List<T> results = (List<T>) sessionFactory.getCurrentSession() .createSQLQuery(sql).addEntity("s", persistentClass).list(); sessionFactory.getCurrentSession().getTransaction().commit(); return results; } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("find by example failed", re); throw re; } } @Override public void remove(PK paramPK) { try { sessionFactory.getCurrentSession().beginTransaction(); T instance = (T) sessionFactory.getCurrentSession().get( persistentClass, paramPK); sessionFactory.getCurrentSession().delete(instance); sessionFactory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("get failed", re); throw re; } } @Override public void removeAll(Collection<T> entities) { log.debug("remove entities"); try { sessionFactory.getCurrentSession().beginTransaction(); for (T t : entities) { // plusVersion(t); sessionFactory.getCurrentSession().delete(t); } sessionFactory.getCurrentSession().getTransaction().commit(); log.debug("remove successful"); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); throw re; } } @Override public void removeByHql(String hql) { try { sessionFactory.getCurrentSession().beginTransaction(); sessionFactory.getCurrentSession().createQuery(hql).executeUpdate(); sessionFactory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("get failed", re); throw re; } } @Override public void saveOrUpdateAll(Collection<T> entities) { log.debug("updateOrSave Project instance"); try { sessionFactory.getCurrentSession().beginTransaction(); for (T t : entities) { sessionFactory.getCurrentSession().saveOrUpdate(t); } sessionFactory.getCurrentSession().getTransaction().commit(); log.debug("updateOrSave successful"); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); throw re; } } @Override public void updateByHql(String hql) { try { sessionFactory.getCurrentSession().beginTransaction(); sessionFactory.getCurrentSession().createQuery(hql).executeUpdate(); sessionFactory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); log.error("get failed", re); throw re; } } @Override public void saveAll(Collection<? extends T> entities) { log.debug("persisting Project instance"); // try { // 每N条提交一次,以减少内存压力 int n = 10000; int ttl = entities.size(); int runNumber = (int) Math.ceil(Float.valueOf(entities.size()) / Float.valueOf(n)); T[] ts = (T[]) entities.toArray(); for (int r = 0; r < runNumber; r++) { sessionFactory.getCurrentSession().beginTransaction(); try { for (int i = 0; i < n; i++) { if (r * n + i >= ttl) break; sessionFactory.getCurrentSession().persist( (T) (ts[r * n + i])); } sessionFactory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException re) { sessionFactory.getCurrentSession().getTransaction().rollback(); throw re; } } log.debug("persist successful"); } }
package dao; import pojo.PersonInfo; public class PersonInfoDao { public static GenericDaoHibernate<PersonInfo, String> personInfoDao = new GenericDaoHibernate<PersonInfo, String>( PersonInfo.class); public static void save(PersonInfo data) { personInfoDao.save(data); } }
Test.java
package hibernateSampleTest; import org.hibernate.*; import org.hibernate.cfg.*; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session = sf.openSession(); Transaction transaction = session.beginTransaction(); PersonInfo personInfo = new PersonInfo(); personInfo.setPid(9); personInfo.setPname("dandan"); personInfo.setAge(20); session.save(personInfo); session.flush(); transaction.commit(); session.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
或者使用JUnit
【注】
hibernate的session.createQuery()方法查不到数据的解决方法
在Hibernate配置文件中加入下面代码:
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
在Hibernate的配置文件 中,hibernate.query.factory_class属性用来选择查询翻译器。例如:
(1)选择Hibernate3.0的查询翻译 器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
(2)选择Hibernate2.1的查询翻 译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
//不通过DAO直接访问数据 package hibernateSampleTest; import pojo.PersonInfo; import java.util.Iterator; import java.util.List; import junit.framework.Assert; import junit.framework.TestCase; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.Query; import com.aliyun.odps.pl.parser.DEPLParser.printStatement_return; public class Test extends TestCase { Session session = null; protected void setUp() { try { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); session = sessionFactory.openSession(); } catch (HibernateException e) { e.printStackTrace(); } } protected void tearDown() { try { session.close(); } catch (HibernateException e) { e.printStackTrace(); } } /* * //测试insert //下面这段代码相当于我们执行了sql语句:insert into personinfo * values(1,'xiaobao',20); public void testInsert() { Transaction * transaction = null; try { transaction = session.beginTransaction(); * PersonInfo personInfo = new PersonInfo(); personInfo.setAge(20); * personInfo.setPname("dida"); personInfo.setPid(1); * session.save(personInfo); session.flush(); transaction.commit(); * Assert.assertEquals(personInfo.getPid().intValue() > 0, true); } catch * (HibernateException e) { e.printStackTrace(); * Assert.fail(e.getMessage()); if (transaction != null) { try { * transaction.rollback(); } catch (HibernateException ee) { * ee.printStackTrace(); } } } } */ // 测试select /* * hibernate的常用接口, Query和Criteria: * Query是执行数据库查询,Query接口包装了一个HQL语句,HQL语句是面向对象的,它引用类名和属性名,而不是表名和字段名。 * Criteria完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,擅长动态查询。 */ public void testSelect() { String hql = "from PersonInfo'"; // hql注意from后面是对象,而不是表名。使用方法session.createQuery(hql) String sql = "select * from personinfo";// sql注意from后面是表名,而不是对象。使用方法session.createSQLQuery(sql) Transaction transaction = null; try { /* transaction = session.beginTransaction(); Query mySqlQuery = session.createSQLQuery(sql).addEntity(PersonInfo.class); List<PersonInfo> list = mySqlQuery.list(); Iterator iterator = list.iterator(); System.out.println(list.size()); while (iterator.hasNext()) { System.out.println(((PersonInfo) iterator.next()).toString()); } */ // 刚开始一直用hql方法查不到数据,原因是需要在hibernate.cfg.xml文件中加入一行: // <property // name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> transaction = session.beginTransaction(); Query mySqlQuery = session.createQuery(hql); List<PersonInfo> list = mySqlQuery.list(); Iterator iterator = list.iterator(); System.out.println(list.size()); while (iterator.hasNext()) { System.out.println(((PersonInfo) iterator.next()).toString()); } } catch (HibernateException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } }
PersonInfoDaoTest.java
//使用DAO方式来访问数据 package hibernateSampleTest; import java.util.Iterator; import java.util.List; import org.junit.Test; import dao.PersonInfoDao; import pojo.PersonInfo; public class PersonInfoDaoTest { @Test public void testInsert() { PersonInfo p = new PersonInfo(); p.setPname("jiji"); p.setAge(19); PersonInfoDao.personInfoDao.save(p); } public void testSelect() { String sql = "select * from personinfo"; List<PersonInfo>list = PersonInfoDao.personInfoDao.findBySql(sql); Iterator<PersonInfo> iterator = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } public static void main(String args[]) { System.out.println("start test"); PersonInfoDaoTest a = new PersonInfoDaoTest(); a.testSelect(); System.out.println("end test"); } }
http://www.blogjava.net/balajinima/articles/146910.html
public List selectCourses(String studentId) { Connection con = null; Statement sta = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection( "jdbc:oracle:thin:@10.85.33.199:1521:glee", "test", "test"); String sql = "select * from course_selection"; String sql2 = "select name from course where id='"; sta = con.createStatement(); ResultSet rs = sta.executeQuery(sql); List list = new LinkedList(); while (rs.next()) { ResultSet rs2 = sta.executeQuery(sql2 + rs.getString("course_id") + "'"); if (rs2.next()) { list.add(rs2.getString("name")); } } return list; } catch (Exception e) { e.printStackTrace(); } return null; }
class DBHelper { public static Connection getConnection() { try { Class.forName(Constants.DB_DRIVER); return DriverManager.getConnection(Constants.DB_URL, Constants.DB_USER, Constants.DB_PWD); } catch (Exception e) { e.printStackTrace(); } return null; } } public List selectCourses(String studentId) { Connection con = null; Statement sta = null; try { con = DBHelper.getConnection(); String sql = "select * from course_selection"; String sql2 = "select name from course where id='"; sta = con.createStatement(); ResultSet rs = sta.executeQuery(sql); List list = new LinkedList(); while (rs.next()) { ResultSet rs2 = sta.executeQuery(sql2 + rs.getString("course_id") + "'"); if (rs2.next()) { list.add(rs2.getString("name")); } } return list; } catch (Exception e) { e.printStackTrace(); } return null; }
public List selectCourses(String studentId) { StudentDAO sd = new StudentDAO(); Student student = sd.findById(studentId); Set set = student.getCourseSelections(); List courseNames = new LinkedList(); for (Iterator iter = set.iterator(); iter.hasNext();) { CourseSelection element = (CourseSelection) iter.next(); courseNames.add(element.getCourse()。getName()); } return courseNames; }
public class Student implements java.io.Serializable { private String id; private String name; private Set courseSelections = new HashSet(0); public Student() { } public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Set getCourseSelections() { return this.courseSelections; } public void setCourseSelections(Set courseSelections) { this.courseSelections = courseSelections; } }
public class StudentDAO { Session session; public StudentDAO() { Configuration cfg = new Configuration(); cfg.configure("/hibernate.cfg.xml"); SessionFactory sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); } public void save(Student transientInstance) { session.save(transientInstance); } public void delete(Student persistentInstance) { session.delete(persistentInstance); } public Student findById(java.lang.String id) { List list = session.createCriteria(Student.class).add( Expression.eq("id", id)).list(); if (list.size() > 0) { return (Student)list.get(0); } return null; } }这里的构造函数是用来启动Hibernate,并获取session。打开一个session就相当于打开了一个数据库连接,然后我们就可以对这个session进行操作,完成数据库操作,完全不用写SQL语句。我这里Hibernate的启动方式写的很不规范,系统应该只需要完成一次Hibernate启动就可以在不同的DAO中使用,我把它写在构造函数里面纯粹是为了简化演示代码。
<hibernate-mapping> <class name="Student" table="STUDENT"> <id name="id" type="string"> <column name="ID" length="10" /> <generator class="assigned" /> </id> <property name="name" type="string"> <column name="NAME" not-null="true" /> </property> <set name="courseSelections" inverse="true"> <key> <column name="STUDENT_ID" length="10" not-null="true" /> </key> <one-to-many class="CourseSelection" /> </set> </class> </hibernate-mapping>
class :class元素定义了Sudent类和STUDENT表映射,然后就定义了各个属性是如何映射的。
id :如果一个属性是数据库的key,那么会用id标签来定义。
column :column定义了当前类的属性和数据库中的哪个字段对应,
generator :generator是id特有的。一般来说id是自增的,由于我的数据库是用的Oracle,它没有自增字段,要实现自增必须用Sequence,这超出了本文的范围,所以我就用assigned来简化示例代码。assigned表示id是用户给定的。
set :有一个比较特别的标签是set,它对应着数据库中的外键关系,上文我提到的通过Student对象可以获得所有相关的选课记录就是通过这里的定义实现的。name属性对应了Student类中的字段名,key表示哪个字段是外键,one-to-many表示Student和CourseSelection是一对多关系,这和事实相符。类似的还有many-to-one,many-to-many,不过这些都不常用,我不介绍了。Hibernate根据这个映射定义文件,在实例化一个POJO(比如Student)的时候,会自动的把定义过映射的属性用数据库中的数据填充,set也包括在内。
<hibernate-configuration> <session-factory> <property name="connection.username">test</property> <property name="connection.url"> jdbc:oracle:thin:@10.85.33.199:1521:glee</property> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect</property> <property name="connection.password">test</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver</property> <mapping resource="Student.hbm.xml"></mapping> <mapping resource="CourseSelection.hbm.xml"></mapping> <mapping resource="Course.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
看了这么多,或许你会有点头皮发麻,POJO,DAO,配置文件...好像要写的东西还是很多。值得庆幸的是现在Hibernate已经发展的比较成熟了,有很多工具来帮助我们完成这些工作,比如MiddleGen,Hibernate Synchronizer等等。我使用的开发工具是Eclipse+MyEclipse,我所要做的只是把数据库表建好,然后MyEclipse提供的工具会自动根据数据库表生成POJO,DAO,*.hbm.xml,甚至hibernate.cfg.xml都是自动完成的(前提是MyEclipse知道你的数据库连接信息)。我并不打算介绍如何用IDE来开发Hibernate,你可以参考IDE的帮助文档。
到这里为止,使用Hibernate进行开发的基本组成元素我都介绍好了,强烈建议你马上实践一遍,即使有些不理解,也先依葫芦画瓢一个。对了,别忘了把Hibernate的包down下来放到classpath里面。
代码片段8:
Configuration cfg = new Configuration(); cfg.configure("/hibernate.cfg.xml"); SessionFactory sessionFactory = cfg.buildSessionFactory();
我们通过Configuration来读取配置文件,然后就可以创建SessionFactory,这段代码在 所有系统中都大同小异,一般就是xml配置文件的名字不一样,所以也没什么好说的。
当我们有了SessionFactory以后就可以获取Session了。调用SessionFactory.openSession()就会返回一个Session实例,然后我们操作这个Session来访问数据库。值得一提的是Session并不是线程安全的,也就是每一个线程都必须有自己的Session。所以我们一般通过以下方法来获取和关闭Session:
代码片段9:
public static Session currentSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { try { cfg.configure(CONFIG_FILE_LOCATION); sessionFactory = cfg.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } session = (sessionFactory != null) ? sessionFactory.openSession(): null; threadLocal.set(session); } return session; } public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } }