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的配置文件中,加入以下配置:

            n<>  //n的取值为1,2,4,8分别对应上面的隔离级别

 

已使用 Microsoft OneNote 2016 创建。