神之手:http://www.blogjava.net/wx886104/archive/2008/08/16/222403.html
1、Java基本类型的Hibernate映射类型
Hibernate映射类型 | Java类型 | 标准SQL类型 | 大小和取值范围 |
integer或者int | int或者java.lang.Integer | INTEGER | 4字节 |
long | long Long | BIGINT | 8字节 |
short | short Short | SMALLINT | 2字节 |
byte | byte Byte | TINYINT | 1字节 |
float | float Float | FLOAT | 4字节 |
double | double Double | DOUBLE | 8字节 |
big_decimal | java.math.BigDecimal | NUMERIC | NUMERIC(8,2)8位 |
character | char Character String | CHAR(1) | 定长字符 |
string | String | VARCHAR | 变长字符串 |
boolean | boolean Boolean | BIT | 布尔类型 |
yes_no | boolean Boolean | CHAR(1) (Y-N) | 布尔类型 |
true_false | boolean Boolean | CHAR(1) (T-F) | 布尔类型 |
2、Java时间和日期类型的Hibernate映射
映射类型 | Java类型 | 标准SQL类型 | 描述 |
date | util.Date或者sql.Date | DATE | YYYY-MM-DD |
time | Date Time | TIME | HH:MM:SS |
timestamp | Date Timestamp | TIMESTAMP | YYYYMMDDHHMMSS |
calendar | calendar | TIMESTAMP | YYYYMMDDHHMMSS |
calendar_date | calendar | DATE | YYYY-MM-DD |
3、Java大对象类型的Hibernate映射类型
映射类型 | Java类型 | 标准SQL类型 | MySQL类型 | Oracle类型 |
binary | byte[] | VARBINARY(或BLOB) | BLOB | BLOB |
text | String | CLOB | TEXT | CLOB |
serializable | Serializable接口任意实现类 | VARBINARY(或BLOB) | BLOB | BLOB |
clob | java.sql.Clob | CLOB | TEXT | CLOB |
blob | java.sql.Blob | BLOB | BLOB | BLOB |
主键产生器
可选项说明:
1) Assigned
主键由外部程序负责生成,无需Hibernate参与。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex 方式生成主键将提供最好的性能和数据库平台适应。另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(AutoIncrease 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。
3 如果需要采用定制的主键产生算法,则在此处配置主键生成器,主键生成器必须实现net.sf.hibernate.id.IdentifierGenerator 接口。
可以在持久化类的访问方法中加入程序逻辑
假如access为field,而且属性对应的持久化类的成员变量是私有类,那么还可以直接访问吗?
持久化类并非所有属性都直接和表的字段匹配,持久化类的有些属性是可以在运行的时候得出的,这些称作派生属性
正如之前的avgPrice属性,该方案包括两个步骤:
- 在映射文件中不映射avgPrice属性
- 在Customer类的setOrders()方法中加入程序逻辑,自动为avgPrice属性赋值。
除了这种方法来设置派生属性,还可以如下解决:
利用<property>元素的formula属性。formula属性用来设置一个SQL表达式,Hibernate将根据它来计算派生属性的值。以Customer类的totalPrice属性为例:
- <property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)"/>
以上SQL语句中的“?”代表JDBC PreparedStatement中的参数。这些SQL语句都存放在SessionFactory的内置缓存中,当执行Session的save()、update()、delete() 、load()和get()方法的时候,将从缓存中找到对应预定义的SQL语句,再把具体的参数值绑定到该SQL语句中。