name=\>com.mysql.jdbc.Driver
6 问题
? 如果使用session.openSession() 可以通过执行多次 session.beginTransaction() 进行多次事务操作。
? 但如果使用session.getCurrentSession() 只能使用一次,如果进行提交,默认情况下,将进行session.close(),
解决此问题,spring采用 OpenSessionInViewFilter 过滤器。 @Test public void demo01(){ Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.getCurrentSession(); //开启事务 Transaction transaction = session.beginTransaction(); //**** 操作 User user = new User(); user.setUsername(\); user.setPassword(\); session.save(user); //5 提交 transaction.commit(); //再开启 Spring OpenSessionInViewFilter Transaction transaction2 = session.beginTransaction(); //**** 操作 User user2 = new User(); user2.setUsername(\); user2.setPassword(\); session.save(user2); //5 提交 transaction2.commit(); //6 释放 session.close(); //7 关闭工厂 factory.close(); } 7 映射文件详解
? 文件名称: javabean名称.hbm.xml ? 位置:javabean同包 ? 内容:
7.1 约束
普通属性 name : 默认用于配置javabean属性名称 length : 配置长度,字符串默认255,mysql类型 varchar(255) column : 当前属性对应表中字段(列)名称,默认name的值 方式1:column属性(attribute) ,
其他配置 access ,用于确定当前属性如何进行数据封装 property : 默认值,hibernate采用javabean属性 与 表字段进行对应。在javabean必须提供 getter/setter方法 field : hibernate采用 javabean 字段 与 表字段进行对应。 可以没有getter/setter方法 例如:private String username; noop : 提供给hibernate hql使用,数据库没有对应字段。一般不使用。 precision 和 scale 给 oracle配置,在mysql没有作用。 precision 配置数字位数 scale 配置小数位数 例如:numeric(precision,scale) , 12.34 numeric(4,2)
7.4 优化hibernate生成sql
? 添加insert 和更新update
? sql语句要求,如果使用字段,默认从当前表A(配置文件描述的表)获得字段,如果要从B表中获得字段,
必须使用表的别名。
8.1 什么是OID
? ? ? ?
java区分对象:hashCode相同
数据库记录:主键primary key 相同
hibernate 通过OID确定相同。及OID相同,对象就相同。OID取值为数据库主键的值。 new User().setUid(1) java是一个对象A,hibernate是一个PO对象C new User().setUid(1) java是另一个对象B,hibernate是同一个PO对象C PO持久对象中的数据,对应 表中一条记录。
8.2 配置OID