一、 单一主键策略
- assigned:表示由java程序来指定id或者手工赋值
- native:由底层数据库自动生成标识符。如果是MySQL就是auto_increment,如果是Oracle就是sequence。
二、 数据基本类型
Hibernate映射类型 | Java类型 | 标准SQL类型 | 大小 |
---|---|---|---|
integer/int | java.lang.Integer/int | INTEGER | 4字节 |
long | java.lang.Long | BIGINT | 8字节 |
short | java.lang.Short | SAMLLINT | 2字节 |
byte | java.lang.Byte/byte | TINYINT | 1字节 |
float | java.lang.Float/float | FLOAT | 4字节 |
double | java.lang.Double/double | DOUBLE | 8字节 |
big_decimal | java.math.BigDecimal | NUMERIC | |
character | java.lang.Character/java.lang.String/char | CHAR(1) | 定长字符 |
string | java.lang.String | varchar | 变长字符 |
boolean/yes_no/true_false | java.lang.Boolean/boolean | BIT | 布尔类型 |
date | java.util.Date/java.sql.Date | DATE | 日期 |
timestamp | java.util.Date/java.sql.Timestamp | TIMESTAMP | 日期 |
calendar | java.util.Calendar | TIMESTAMP | 日期 |
calendar_date | java.util.Calendar | DATE | 日期 |
上述表格中,日期、时间的类型较容易混淆,需要注意,Hibernate类型的date表示日期(对应java类型中的Date),time则表示时分秒,timestamp是时间戳(包含日期以及时分秒),calendar与timestamp相同,calendar_date代表日期年月日。
三、 对象类型
Hibernate映射类型 | Java类型 | 标准SQL类型 | MySQL类型 | Oracle类型 |
---|---|---|---|---|
binary | byte[] | VARCHAR(BLOB) | BLOB | BLOB |
text | java.lang.Stirng | CLOB | TEXT | CLOB |
clob | java.sql.Clob | CLOB | TEXT | CLOB |
blob | java.sql.Blob | BLOB | BLOB | BLOB |
在MySQL中不支持标准SQL的CLOB类型,在MySQL中,用TEXT/MEDIUMTEXT/LONGTEXT来表示长度超过255的长文本数据。
四、 组件属性
实体类的某个属性属于用户自定义类的对象,这就叫做组件属性。
<component name="address" class="Address">
<property name="postcode" column="POSTCODE"/>
<property name="phone" column="PHONE"/>
<property name="address" column="ADDRESS"/>
</component>
例如,如果某个实体类对象有一个address属性,那么它就是一个组件属性。在对象关系映射文件(*.hbm.xml)中,上述component标签和property是同一级的。
五、 单表CRUD方法
使用session的save()、update()、delete()、查询单个结果:get()/load()。
get()/load()方法:第一个参数代表要查询的实体类或者表,第二个参数表示要查询的对象的主键.
get()和load()的区别:
1. 在不考虑缓存的情况下,get()方法会在调用之后立刻向数据库发出SQL语句,返回持久化对象。load()在调用之后返回的是一个代理对象,该对象只保存一个id属性,只有在其他非主键属性被使用到时才发出SQL语句。
2. 当查询的数据不存在时,get()返回的是null。而load()则抛出org.hibernate.ObjectNotFoundException.