对象标识符号 在关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相同来判断两对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。如下代码所示,三次调用了Session的load()方法,分别加载OID为1或3的User对象。 Transaction tx = session.beginTransaction();
User user1 = (User)session.load(User.class,new Long(1));
User user2 = (User)session.load(User.class,new Long(1));
User user3 = (User)session.load(User.class,new Long(3));
System.out.println( user1 == user2 );
System.out.println( user1 == user3 );
|
应用程序在执行上述代码时,第一次加载OID为1的User对象,从数据库中查找ID为1的记录,然后创建相应的User实例,并把它保存在Session缓存中,最后将该实例的引用赋值给变量user1。第二次加载OID为1的对象时,直接把Session缓存中OID为1的实例的引用赋值给变量user2。因此,表达式user1==user2的结果为true。 标识的生成可以使用不同的策略,表1为Hibernate内置的标识生成策略。 表1:Hibernate标识生成策略 标识符生成器 | 描述 | increment | 适用于代理主键。由Hibernate自动以递增方式生成。 | identity | 适用于代理主键。由底层数据库生成标识符。 | sequence | 适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。 | hilo | 适用于代理主键。Hibernate分局high/low算法生成标识符。 | seqhilo | 适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。 | native | 适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。 | uuid.hex | 适用于代理主键。Hibernate采用128位的UUID算法生成标识符。 | uuid.string | 适用于代理主键。UUID被编码成一个16字符长的字符串。 | assigned | 适用于自然主键。由Java应用程序负责生成标识符。 | foreign | 适用于代理主键。使用另外一个相关联的对象的标识符。 |
Hibernate映射类型 在对象/关系映射文件中,Hibernate采用映射类型作为Java类型和SQL类型的桥梁。Hibernate映射类型分为2种:内置映射类型和自定义映射类型。 1、内置映射类型 Hibernate对所有的Java原生类型、常用的Java类型如String、Date等都定义了内置的映射类型。表2列出了Hibernate映射类型、对应的Java类型以及对应的标准SQL类型。 表2:Hibernate内置映射类型 Hibernate映射类型 | Java类型 | 标准SQL类型 | 大小 | integer/int | java.lang.Integer/int | INTEGER | 4字节 | long | java.lang.Long/long | BIGINT | 8字节 | short | java.lang.Short/short | SMALLINT | 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.util.Timestamp | TIMESTAMP | 日期 | calendar | java.util.Calendar | TIMESTAMP | 日期 | calendar_date | java.util.Calendar | DATE | 日期 | binary | byte[] | BLOB
| BLOB | text | java.lang.String | TEXT | CLOB | serializable | 实现java.io.Serializablej接口的任意Java类 | BLOB | BLOB | clob | java.sql.Clob | CLOB | CLOB | blob | java.sql.Blob | BLOB | BLOB | class | java.lang.Class | VARCHAR | 定长字符 | locale | java.util.Locale | VARCHAR | 定长字符 | timezone | java.util.TimeZone | VARCHAR | 定长字符 | currency | java.util.Currency | VARCHAR | 定长字符 |
2、自定义映射类型 Hibernate提供了自定义映射类型接口,允许用户以编程的方式创建自定义的映射类型。用户自定义的映射类型需要实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType接口。具体的创建自定义映射类型的方法请参考hibernate官方文档或相关资料,这里不再详细介绍。  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |