使用hibernate.default_schema属性可以让所有生成的表都带一个指定的前缀。
不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库。session可以理解为操作数据库的对象。session与connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。把对象保存在关系数据库中需要调用session的各种方法,如save(),update(),delete(),createQuery()等。
hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式。
例如:
session.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { conn.setAutoCommit(true); } }); session.save(s1); // 保存对象进入数据库 session.flush();注意一定不能忘记flush()方法。
获取session对象的两种方式:
(1). SessionFactory的openSession()方法
(2) SessionFactory的getCurrentSession()方法
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>openSession和getCurrentSession的区别:
(1). getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你手动关闭。如果使用openSession而没有手动关闭,多次之后就会导致连接池溢出。
(2). openSession每次创建新的session对象,而getCurrentSession使用现有的session对象。
@Test public void testSaveStudentWithOpenSession() { // 获得配置对象 Configuration config = new Configuration().configure(); // 获得服务注册对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(config.getProperties()).buildServiceRegistry(); // 获得SessionFactory对象 SessionFactory sessionFactory = config .buildSessionFactory(serviceRegistry); // 获得Session对象 Session session1 = sessionFactory.openSession(); // 开启事物 Transaction transaction = session1.beginTransaction(); // 生成一个学生对象 Student s = new Student(1, "李四", "男", new Date(), "北京"); session1.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { System.out.println("Connection的hashCode:" + conn.hashCode()); } }); session1.save(s); // session1.close(); // 提交事务 transaction.commit(); // 新创建一个session提交 Session session2 = sessionFactory.openSession(); transaction = session2.beginTransaction(); s = new Student(2, "王五", "男", new Date(), "上海"); session2.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { System.out.println("Connection的hashCode:" + conn.hashCode()); } }); session2.save(s); transaction.commit(); } @Test public void testSaveStudentWithGetCurrentSession() { // 获得配置对象 Configuration config = new Configuration().configure(); // 获得服务注册对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(config.getProperties()).buildServiceRegistry(); // 获得SessionFactory对象 SessionFactory sessionFactory = config .buildSessionFactory(serviceRegistry); // 获得Session对象 Session session1 = sessionFactory.getCurrentSession(); // 开启事物 Transaction transaction = session1.beginTransaction(); // 生成一个学生对象 Student s = new Student(1, "李四", "男", new Date(), "北京"); session1.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { System.out.println("Connection的hashCode:" + conn.hashCode()); } }); session1.save(s); // session1.close(); // 提交事务 transaction.commit(); // 新创建一个session提交 Session session2 = sessionFactory.getCurrentSession(); transaction = session2.beginTransaction(); s = new Student(2, "王五", "男", new Date(), "上海"); session2.doWork(new Work() { @Override public void execute(Connection conn) throws SQLException { System.out.println("Connection的hashCode:" + conn.hashCode()); } }); session2.save(s); transaction.commit(); }通过例子我们可以看出在不关闭session的情况下,使用openSession每一次获得的都是新的session,而使用getCurrentSession获得的都是同一个session,所以在使用openSession获得的session操作完毕后,需要手动close掉。
<class>标签常用属性:
<id>标签的常用属性:
常见主键生成策略:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/scarthr/article/details/47148765