马士兵hibernate文档 (个人完善版)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.

hibernate.hbm2ddl.auto :

在SessionFactory 创建时,自动检查数据库结构,或者将数据库schema 的DDL 导出到数据库。使用create-drop 时,在显式关闭SessionFactory 时,将删除掉数据库schema。

例如:validate | update | create | create-drop

create :如果没有表就创建

update :如果表结构更新,就更新

validate :每次插入表的时候看看表结构有没有更新。

理论上是先建类后建表:这个时候只要你的类建好了,可以跨数据库。

实际中先建表比先建类多,建好表以后要对数据库进行优化,比如建索引,建试图,各种各样的优化。

project\etc目录下面有很多示例性的文档,log4j的文档就在那个下面。

SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); SessionFactory的建立是很耗费时间的,应该像连接池一样,只建立一次,以后要用就直接从那用。

Hibernate文档建议我们自己写一个辅助类,用单例来做。

JUnit的一个bug:

@BeforeClass

public static void beforeClass() {

sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

}

在这句话的时候

配置文件如果有的时候写错了,她悄悄把错误隐藏起来了。

解决的方法:可以对这句话加try catch块

8.表名和类名不一致的时候:

@Entity

@Table(name="_teacher")

public class Teacher {

10字段名和属性名不一致的时候

@Column(name="_name")

public String getName() {

return name;

}

11 不需要的字段的设置

@Transient

public String getYourWifeName() {

return yourWifeName;

}

12 映射指定的时间日期

@Temporal(TemporalType.TIME)

public Date getBirthDate() {

return birthDate;

}

在注解里面如果一个注解的属性名字叫value,你可以不写,直接写后面的值,如@Temporal(value=“TemporalType.TIME”)可写成上面的那样。

如果不写会把时间日期都放到表里面

指定时间时默认TemporalType.TIMESTAMP

还有time 和date 不过最常用的还是默认的。

13注意映射枚举类型用habernate xml的方式很麻烦

在设定枚举时:以字符串方式显示:EnumType.STRING 以数字书序显示:EnumType.ORDINAL

@Enumerated(EnumType.STRING)

public Gender getGender() {

return gender;

}

自增Mysql autoincreatment Oracle sequence

如果将来的程序想跨数据库平台选native或uuid

@GenerateValue注意是javax.persistence里的value,默认的是native

increment(很少用)

用于为long, short 或者int 类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。

identity(用得较多)

对DB2,MySQL,MS SQL Server,Sybase 和HypersonicSQL 的内置标识字段提供支持。返回的标识符是long,short 或者int 类型的。

sequence(用得较多)

在DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence),而在Interbase 中使用生成器(generator)。返回的标识符是long,short 或者int 类型的。

hilo

使用一个高/低位算法高效的生成long,short 或者int 类型的标识符。给定一个表和字段(默认分别是hibernate_unique_key 和next_hi)作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

uuid

用一个128-bit 的UUID 算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP 地址)。UUID 被编码为一个32 位16 进制数字的字符串。

guid

在MS SQL Server 和MySQL 中使用数据库生成的GUID 字符串。

Native(用得较多)

根据底层数据库的能力选择identity、sequence 或者hilo 中的一个。

在Oracle里面表名不能以下划线开头

@Id

@GeneratedValue (默认的是auto相当于native,在jpa1.0中,只有四种ID生成策略,下面的b、c、d、e)

这种方式虽然是跨平台的,但是由于各种数据库生成数据的方式不同,生成的数据会有所不同。如果要在跨平台的数据库中生成的方式也相同,可以采用e。但极少会出现跨数据库平台的情况。用auto的方式在Oracle中sequence生成策略只能起名hibernate sequence,不能起别的名字。

跨数据库平台的情况:自己写了一个给别人用的类库,这个类库可以跨平台。

public int getId() {

return id;

}

@Id

@GeneratedValue(strategy=GenerationType.TABLE, generator="Teacher_GEN")这里也可指定生成别的方式。GenerationType可以在javaee文档里面找

public int getId() {

return id;

}

在Oracle中生成方式如果是sequence,可以指定一个sequence的名字。

@SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")

public class Teacher {

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="teacherSEQ")

public int getId() {

return id;

}

相关文档
最新文档