一、数据库的隔离级别
脏读 | 不可重复读 | 幻读 | |
Read uncommited | Y | Y | Y |
Read commited | N | Y | Y |
Repeatable read | N | N | Y |
Serializable | N | N | N |
查询MySql隔离级别:select @@gloable.tx_isolation,@@tx_isolation
二、Session的flush
1、使用UUID主键生成策略测试flush
1 User user = new User(); 2 user.setUname("张三"); 3 user.setGender(1); 4 user.setBirthday(new Date()); 5 //因为是uuid方式生成的主键,由Session给生成,把user对象存储在Session的临时存储区 6 session.save(user); 7 //发出sql语句,清理临时存储区,把dirty变成false 8 session.flush(); 9 tx.commit();
2、使用native主键生成策略测试flush
1 //因为是使用native方式生成主键,所以save的时候要发出sql来产生主键,持久区有数据,dirty是true 2 session.save(user); 3 //把dirty变成false 4 session.flush();
//因为是使用native方式生成主键,所以save的时候要发出sql来产生主键,持久区有数据,dirty是true session.save(user); //把user逐出Session session.evict(user); //Session中没有数据flush没有意义 session.flush(); //但是commit依然会把数据提交到数据库,因为sql已经发出了 tx.commit();
3、session的flush能完成大量数据入库的功能
1 for(int i = 0; i < 100009; i++){ 2 User user = new User(); 3 user.setUname("张三"); 4 user.setGender(1); 5 user.setBirthday(new Date()); 6 session.save(user); 7 if(i%100 == 0){ 8 session.flush(); 9 } 10 } 11 session.flush(); 12 tx.commit();
三、多对一:
1、创建模型: 多的一端引入一的一端作为类的成员变量,
2、配置映射文件:
1 <!-- 多对一关系映射 cascade: delete save-update all --> 2 <many-to-one name="team" column="t_No" cascade="save-update"></many-to-one>
cascade级联,在保存多的一端的时候,会自动级联保存一的一端
四、一对一单向关联:
1、创建模型:
1 public class IDCard {
//主键 2 private Integer cardId; 3 private String cardNo;
//指定一对一的关系 4 private Emp emp; 5 }
2、配置映射文件
1 <class name="IDCard" table="t_id_card"> 2 <id name="cardId" column="emp_No"> 3 <!-- 使用外键方式生成主键 --> 4 <generator class="foreign"> 5 <param name="property">emp</param> 6 </generator> 7 </id> 8 <property name="cardNo" column="card_no"></property> 9 <!-- 指定一对一关系 constrained:建表时带有外键约束 --> 10 <one-to-one name="emp" constrained="true"></one-to-one> 11 </class>
五、一对一双向关联:
1、创建模型: 在双放都引入对应的一对一关系
2、配置映射文件
1 <one-to-one name="card"></one-to-one>
六、一对多单向:
1、创建模型:在一的一方,通过集合引入多的一方
2、配置映射文件:
一对多是有缺陷的,保存的时候如果多的一端的外键是非空,一对多的保存就不成立
<set name="set"> <!-- key:在多的一端的表中要产生的外键 column:外键名称 --> <key column="t_id"></key> <!-- one-to-many:指定多的一端的类 class:多的一端的类 --> <one-to-many class="Emp"/> </set>
七、一对多双向:
1、创建模型:在多的一方,再添加一的一端的引入
2、配置映射文件:
1 <!-- 2 指定多对一的关系: 3 name:一的一端属性名 4 column:多的一端的表中要产生的外键字段,注意在team.hbm.xml中已经配置了这个外键, 5 现在要求我们配置的这个外键要和team.hbm.xml中配置的多的一端外键名称相同, 6 因为这两个配置指的是同一个列 7 --> 8 <many-to-one name="team" column="t_id"></many-to-one>
八、多对多单向:
1、创建模型:在多的一方,以集合形式引入另一个多的一方
2、配置映射文件:
1 <!-- 配置set,设置多对多的单端集合 table:要产生的中间表 --> 2 <set name="roles" table="emp_role" cascade="save-update"> 3 <!-- 把当前表的主键给中间表作为外键 column:当前主键名称 --> 4 <key column="emp_No"></key> 5 <many-to-many class="Role" column="role_id"></many-to-many> 6 </set>
九、多对多双向:
1、创建模型:双发都引入对方
2、配置映射文件“
十、延迟加载:
1、class上的延迟加载: get默认不使用延迟加载,load使用延迟加载,延迟加载必须在同一个session范围内
2、集合的延迟加载:默认是有延迟加载的, 集合的加载效果不受类上延迟加载影响
如果查询集合数量时候,需要用lazy="extra" 提高效率
3、单端延迟加载
针对多对一 和 一对一 的延迟加载,默认是lazy=proxy来使用延迟加载