hibernate -- hibernate故事会
hibernate故事会
2016年1月29日
9:34
关于id生成策略的故事:
“assigned”–主键由外部程序负责生成,在 save() 之前指定一个。
“hilo”–通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
“seqhilo”–与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
“increment”–主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”–采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
“sequence”–采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
“native”–由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
“uuid.hex”–由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
“uuid.string”–与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。
“foreign”–使用另外一个相关联的对象的标识符作为主键。
关于日期类型的故事:
1、在java中代表时间和日期的类型有util包中的Date和Calendar
在Jdbc中提供了Date的三个子类:java.sql.Date java.sql.Time和java.sql.Timestamp分别和标准sql中的DATE,TIME,TIMESTAMP类型相对应
2.因为java中的Date是Jdbc中三个时间类的父类,所以它可以对应标准sql中的三种时间类型。
3.基于以上两点,我们在设置持久化类的是Date类型时,设置为java.util.Date.
4.那么我们如何才能把两者映射关联起来呢?
在我们配置持久化类的映射文件时的property中配置,例如
mysql的事务隔离级别:
事务隔离是个什么东西呢:当有两个事务在同时操作一个数据的时侯会产生冲突,比如一个事务读取了一个数据后另一个事务修改了这个数据,那这个时候前一个事务读的数据应该是什么呢?由此产生了事务隔离级别的概念,事务的隔离级别有4个,分别是:
1.read uncommitted 叫做读未提交内容:这个隔离级别表示每个事务都可以读取到别的事务未提交的内容,这个事务的隔离级别很少被真正的应用,我们想一下,瞎读别人还没有提交的内容显然不科学,会产生各种问题。
2.read committed 叫做读提交内容:这个是大多数数据库的默认级别,但不是MySQL的默认级别,这个的意思是读取提交的内容。
3.repeatable read 叫做可重读:这个是MySQL的默认级别,它确保同一事务的实例在并发读取数据是能看到同样的数据行。
4.serializable 叫做可串行化:这个级别会要求事务排序,使他们能够不产生冲突,但明显这个级别会导致效率低下。
由于事务的隔离级别不同会产生以下的典型问题:
脏读:一个事务更新了一个数据,另一个事务读取了这条数据后,原来的事务rollback了这个操作,导致后一个事务读取的数据不正确。
不可重复读:一个事务的两次查询的数据不一致,比如上面的情况。
幻读:同样是一个事务在两次查询中发现数据不一致。
那么我们如何改变项目中默认的隔离级别呢:在hibernate的配置文件中,加入以下配置:
已使用 Microsoft OneNote 2016 创建。
