Id生成策略
- XML中通过在Id标签中加入Generator标签设置,例如:
<id name="id"> <!-- 主键生成机制(除以下四种很少使用) identity 采用数据库生成机制(MySQL、SQL Server、DB2) sequence 采用数据库生成机制(Oracle),Oracle中默认生成hibernate_sequence序列 native 根据数据库方言选择identity或sequence,最为常用 uuid 由Hibernate自动生成,可以跨数据库使用 --> <generator class="native"/> </id>
- Annotation中通过@GeneratedValue设定,例如:
GenerrateValue有两个属性:strategy用于设置自动生成策略,他的可选属性有:@Id @GeneratedValue public int getId() { return id; }
@Id @GeneratedValue //默认为AUTO MySQL下使用auto_increment,Oracle下使用hibernate_sequence序列 @GeneratedValue(strategy=GenerationType.IDENTITY) //MySQL、SQL Server等数据库使用 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="id_seq") @SequenceGenerator(name="id_seq", //与generator对应 <span style="white-space:pre"> </span>sequenceName="id_sequence" //指定生成序列名 <span style="white-space:pre"> </span>) //Oracle中使用 @GeneratedValue(strategy=GenerationType.TABLE, generator="id_table") @TableGenerator( name="id_table", //与generator对应 table="db_table", //指定生成表名 pkColumnName="id_key", //指定表key字段名 valueColumnName="id_value", //指定表value字段名 pkColumnValue="class_name" //指定表key字段值(对应类名) ) //自定义表存放生成主键值
联合主键配置方法
- 写一个POJO封装联合主键需要的属性,实现Serializable接口并重写equals方法和hashcode方法,将原类主键属性去除改为主键对象。XML配置:
Annotation只需要在主键类上加上@Embeddable,将主键对象设为@Id即可。<hibernate-mapping> <class name="com.bjsxt.pojo.Student" > <composite-id name="studentPK" class="com.bjsxt.pojo.StudentPK"> <key-property name="id"></key-property> <key-property name="name"></key-property> </composite-id> <property name="age" /> <property name="sex" /> <property name="good" type="yes_no" /> </class> </hibernate-mapping>
- 不在主键类上加入@Embeddable,将主键对象设为@EmbeddedID
- 保留原类属性,在联合主键的每一条属性上都加上@Id,原类加上@IdClass(className.class)
openSession和getCurrentSession的区别
- openSession每次都会打开一个新Session,getCurrentSession会在上下文寻找Session,如果找不到则会打开一个新Session
- openSession使用完毕后需要close,getCurrentSession则不用
- getCurrentSession的上下文环境可以通过current_session_context_class设置,常用的是Thread(Connection)和jta(分布式)
Session的增删改查
- get和load:get检索不到对象时会返回空,load会报ObjectNotFoundException异常。get为即使加载,load为延时加载,在使用对象属性时才发出sql语句。
- update:查询的对象必须要有id,缓存中对象只要属性更改,在commit时会自动更新。更新时会更新所有字段,担心效率请用HQL。
- save和saveOrUpdate:save直接存储对象,saveOrUpdate会在存储对象前寻找该对象,如果找到了则更新该对象。
- clear:强制清除Session中的缓存
- flush:强制将数据库与缓存同步(默认在commit时使用)
三种对象状态
- 临时态:一般为刚刚创建的对象或者已经被delete的对象,特点是Session缓存中和数据库中都没有该对象的数据
- 游离态:将对象存入或取出到Session缓存中的状态,特点是数据库中与缓存中都有该对象的数据
- 持久态:对象存入数据库后缓存消失的状态,特点是缓存中没有该对象但是数据库中已经保存了该对象的数据