Hibernate学习(一)----Hibernate知识要点

Hibernate知识要点

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.blogjava.net/edsionsz/archive/2011/02/24/345041.html" dc:identifier="http://www.blogjava.net/edsionsz/archive/2011/02/24/345041.html" dc:title="Hibernate知识要点" trackback:ping="http://www.blogjava.net/edsionsz/services/trackbacks/345041.aspx" /> </rdf:RDF> -->

新建项目

2 学习建立user-library-hibernate,并加入相应的jar

a项目右键-build path-configure build path-add library

b选择user-library,在其中新建library,命命为hibernate

c 在该library中加入hibernate所需要的jar

hibernate3.3.2

/hibernate3.jar

/lib/required目录下的所有包 6

Sl4j-nop jar

3 引入mysqlJDBC驱动包

4 MYSQL中建数据库和相应的表student(id,name,age)

5 建立hibernate配置文件hibernate.cfg.xml

参考文档中COPY,修改对应的数据库连接,

6 建立student

7 建立映射文件Student.hbm.xml 参考相应文档

8 将映射文件加到hibernate-cfg.xml

搭建日志环境并配置显示DDL语句

slf的实现:slf4j nodep ,log4j ,jdk logging api ,apache common-log.

slf4j.nop.jarslf-api.jar其相应的接口实现

slf的接口对到log4j的实现,user libraryhibernate,slf的实现slf4j-nop-1.5.8.jar去掉,添加log4j的实现log4j-1.2.15.jar,再添加一个slf-apilog4j转换器slf4j-log4j12-1.5.8.jar.

slf的接口转换成log4j的接口.最后添加一个log4j的配置文件log4j.properties

利用HIBERNATE导出数据库建表

//读取配置文件hibernate.cfg.xml

Configuration cfg=new AnnotationConfiguration().configure();(有注解时使用AnnotationConfiguration),configure()可以手动指定配置文件名称.

Configuration cfg=new Configuration(),会默认读取hibernate.properties文件

//创建schemaExport对象

import org.hibernate.tool.hbm2ddl.SchemaExport;

SchemaExport export=new SchemaExport(cfg);

//创建数据库表

export.create(true, true);

对象映射(采用Annotation注解方式)

1 建表

Create table teacher(id int primary key,name varchar(20),title varchar(20));

2 创建teacher,并进行注解@

import javax.persistence.Entity;

import javax.persistence.Id;

bean中加注解

@ Entity,@Id(加在getId()上面)

3 hibernate中加入annotation相应的jar

hibernate-annotations.jar

/lib目录下加入相应的包ejb3-persistence.jar, hibernate-commons-annotations.jar

注意:annotation文档中并没有提到hibernate-annotations.jar

4 参考annotation文档建立对应的注解

5 hibernate.cfg.xml中建立映射

<mapping class=”com.xx.xx”/>

6 示例

//AnnotationConfiguration;

Configuration cfg=new AnnotationConfiguration();

SessionFactory sf=cfg.configure().buildSessionFactory();

Session session=sf.openSession();

session.beginTransaction();

session.save(t);//

session.getTransaction().commit();

session.close();

sf.close();

对象映射(采用配置文件方式)

1 在相应的类中建立对应的配置文件.

例如Student类对应的配置文件Student.hbm.xml

<hibernate-mapping package="com.model">

<class name="Student" table=" Student" >

<id name="id" column="id"></id>

<property name="name" column="name" />

<property name="age" column="age" />

</class>

</hibernate-mapping>

2 hibernate.cfg.xml中添加该映射文件Student.hbm.xml即可

<!-- 建立对应的配置文件关联相应的数据库表 -->

<mapping resource="com/model/Student.hbm.xml"/>注意包名的写法

3 示例

//读取配置文件hibernate.cfg.xml

Configuration cfg=new Configuration().configure();

//创建SessionFactory

SessionFactory sf=cfg.configure().buildSessionFactory();

//创建session

Session session=sf.openSession();

session.beginTransaction();

session.save(s);

session.getTransaction().commit();

session.close();

sf.close();

hibernate.cfg.xml配置

hibernate.hbm2ddl.auto属性

取值: validate | update | create | create-drop

sessionfactory创建时,自动检查数据结构,或者将数据库schema()DDL导出到数据库,使用create-drop,在显式关闭sessionfactory,drop掉数据库schema.

validate 加载hibernate时,验证创建数据库表结构
create
每次加载hibernate,重新创建数据库表结构
create-drop
加载hibernate时创建,退出是删除表结构
update
加载hibernate自动更新数据库结构

表名和类名不同的情况时,对表名进行配置

1 在注解中

import javax.persistence.Table;

@Table(name=”TableName”)

2 XML文件中

<hibernate-mapping package="com.model">

<class name="Teacher" table="Teacher" >配置对应的table属性为相应的表名

<id name="id" column="id"></id>

</class>

</hibernate-mapping>

字段名和属性名相同,默认为

对于annotation,如果什么注解都不写的话,相当于加了注解@Basic

实体bean中所有的非statictransient的属性都可以被持久化, 除非你将其注解为@Transient.所有没有定义注解的属性等价于在其上面添加了@Basic注解. 通过 @Basic注解可以声明属性的获取策略(fetch strategy)

对于XML文件中不用写column.

字段名和属性名不同时

Annotation:@column(name=”column_name”)加上相应的getXXX()方法上

XML:column属性

不需要persistence的字段

import javax.persistence.Transient;

@ Transient 意思是说这个属性是透明的,不进行持久化,存储的时候不存进去

映射日期和时间类型,指定时间精度

Annotation:

import javax.persistence.Temporal;

@Temporal(TemporalType.TIME)

XML:指定type

<class name="Teacher" table="Teacher" >

<id name="id" column="id"></id>

<property name="name" type="time" />type=timedate

</class>

枚举类型的转换

@Enumerated(EnumType.STRING)

字段映射的位置

推荐写在gexXXX方法上

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

在程序中通过 Hibernate 来保存 java.sql.Clob 或者 java.sql.Blob 实例时,必须包含两个步骤:

1 在一个数据库事务中先保存一个空的 Blob Clob 实例。

2 接着锁定这条记录,更新上面保存的 Blob Clob 实例,把二进制数据或文本数据写到 Blob Clob 实例中

Hibernate SQL方言 (hibernate.dialect)

RDBMS

方言

DB2

org.hibernate.dialect.DB2Dialect

DB2 AS/400

org.hibernate.dialect.DB2400Dialect

DB2 OS390

org.hibernate.dialect.DB2390Dialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

MySQL

org.hibernate.dialect.MySQLDialect

MySQL with InnoDB

org.hibernate.dialect.MySQLInnoDBDialect

MySQL with MyISAM

org.hibernate.dialect.MySQLMyISAMDialect

Oracle (any version)

org.hibernate.dialect.OracleDialect

Oracle 9i/10g

org.hibernate.dialect.Oracle9Dialect

Sybase

org.hibernate.dialect.SybaseDialect

Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

Microsoft SQL Server

org.hibernate.dialect.SQLServerDialect

SAP DB

org.hibernate.dialect.SAPDBDialect

Informix

org.hibernate.dialect.InformixDialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

Ingres

org.hibernate.dialect.IngresDialect

Progress

org.hibernate.dialect.ProgressDialect

Mckoi SQL

org.hibernate.dialect.MckoiDialect

Interbase

org.hibernate.dialect.InterbaseDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

FrontBase

org.hibernate.dialect.FrontbaseDialect

Firebird

org.hibernate.dialect.FirebirdDialect

ID生成策略<generator>

1.XML方式配置

可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, <param>元素来传递。

<id name="id" type="long" column="cat_id">

<generator class="org.hibernate.id.TableHiLoGenerator">

<param name="table">uid_table</param>

<param name="column">next_hi_value_column</param>

</generator>

</id>

所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:

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

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

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

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

l seqhilo 使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

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

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

l native 根据底层数据库的能力选择identity, sequence 或者hilo中的一个。mysql中默认的是auto_increment,SQLSERVER中是identity.

l assigned 让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

l select 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

l foreign 使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

l sequence-identity 一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3getGeneratedKeys结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向JDK 1.4Oracle 10g驱动支持这一策略。注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。(原文:Note comments on these insert statements are disabled due to a bug in the Oracle drivers.

2 annotation中配置id生成策略

使用@Id注解可以将实体bean中的某个属性定义为标识符(identifier). 该属性的值可以通过应用自身进行设置, 也可以通过Hiberante生成(推荐).

使用 @GeneratedValue注解可以定义该标识符的生成策略: 有四种策略

l AUTO -默认值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值