持久化对象的状态
持久化对象的状态有:站在持久化的角度,hiberante把对象分为4中状态:持久化状态,临时状态,游离状态,删除状态
Session的特定方法使对象从一个状态转化到另一个状态。
1)临时对象(Transient):
-)在使用代理主键的情况下,oid通常为null。
不处于Session的缓存中
在数据库中没有对应的记录
2)持久化对象(也叫托管)(persist)
OID不为null
位于Session缓存中
若在数据库中已经没有和期对应的记录,持久化对象和数据库中的相关记录对应。
Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库
在同一个Session实例的缓存中,数据库表中的每条记录之对应唯一持久化对象。
3)删除对象(Removed)
在数据库中没有和其oid对应的记录
不在处于Session缓存中
一般情况下,应用程序不该再使用被删除的对象
4)游离对象(也叫“托管”)(Detached):
OID不为null
不再处于Session缓存中
一般情况需游离对象是由持久化对象转变过来的。因此在数据库中可能还存在与他对应的记录。
Hibernate配置文件
hibernate的配置文件主要用于配置数据库连接和hibernate运行时所欲的各种属性,
每个hibernate的配置文件对应一个Configuration对象,
hibernate配置文件可以有两种格式
1)hibernate.cfg.xml
2)hibernate.properties
3.在hibernate中使用C3P0数据源
1)导入jar包
c3p0-0.9.2.1.jar
c3p0-oracle-thin-extras-0.9.2.1.jar
mchange-commons-java-0.2.3.4.jar
2)加入配置项
hibernate.c3p0.max_size:数据库连接池的最大连接数。
hibernate.c3p0。min_size:数据库连接池的最小连接数
hiberante.c3p0.acquire_increment:数据库连接池大众的连接耗尽时,同意石窟获取多少个数据库连接。
hiberante.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内所哟连接对象是否超市,
连接池本身不会把自己从连接池中移除,而是专门有一个线程按照时间间隔来做这件事情。这个先策划能够给你过比较连接对象醉意一次背时用时间和
当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
hibernate.c3p0.max_statemetns:缓存Statement数量对象。
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="c3p0.idle_test_period">2000</property>
<property name="c3p0.max_statements">10</property>
<property name="c3p0.timeout">2000</property>
Pojo的映射文件.hbm.xml
pojo类和管理系数据库之间的映射可以用一个xml文件来映射
hibernante-mapping
类层次:class
主键:id
基本类型:property
实体应用类。many-to-one|one-to-one
集合:set|list|map|array
-one-to-many
-many-to-many
子类:subclass|joined-subclass
其他:component|any等
查询语句:query(用来存放。查询语句,便于对数据库查询的统一管理和优化)
每个hibernate-mapping中可以同时定义多个类,但更推荐为每个类都创建一个单独的映射文件。
在java中代表时间和日期的类型包括:java.util.Date和java.util.Calendar
此外,在jdbcapi中还提供了3个扩展了java.util.Date类子类。java.sql.Date,java.sql.time
和java.sql.Timestamp,这三个类分贝和标准的sql类型的 date
Mapping映射文件
class 下的name="com.test.User"可以换成 <hibernate-mapping package="name="com.test.User"">
如果有多个class标签就不用在一一尽行配置值name属性了
动态更新:dynamic-update="true"
<class name="com.test.User" table="users1" catalog="test" dynamic-update="true" >
更改数据库信息时候,数据库语句只显示更改的字段
eg:只更改username时候, update
test.users1
set
username=?
where
id=?
映射对象标识符
Hiberante使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系。对象的OID和数据表的主键对应
Hibernate通过标识符生成器来为主键赋值。
Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型节省跟多的数据库空间。
在对象--关系映射文件中,<id>元素用来设置对象标识符。<generatror> 子元素用来设定标识符生成器。
Hibernate提供了标识符生成器接口,IdentifierGnerator,并提供 了各种内置实现
id:设定持久化类的oid和表的映射
name:标示持久化类的oid的属性名
column:设置标识符属性的oid属性名(主键字段名)
unsaved-value:若设定了该属性,Hibernate会通过比较持久化类的oid值和该属性值来区分当前持久化类的对象是否为临时对象。
generator:主键生成策略
1.increment(开发时候不建议使用):标识符生成器有hibernate以递增的方式为代理主键赋值,Hibernat会先读取数据表中主键的最大值,而接下
向数据表中插入记录时候,就在读取最大值的基础上加一。它的适用范围:由于increment生存标识符机制不依赖于底层数据库系统。一in次它适合所有的数据库系统,
适用于只有耽搁Hibernate应用进程的访问同一个数据库的场合,在集群环境下不推荐是用,oid必须为long,int 或者为short 如果把oid定义为byte类型。则运行时候会出出现异常
2.inentity标识符生成器:identity标识符生成器有底层数据库来负责生成标识符。它要求底层数据库把主键定义为自动增长的字段类型。
适用范围:由于identity生成标识符的机制依赖于底层数据库系统,因此要求底层数据库系统必须支持泽东整张字段类型。支持自动增长字段类型的数据库包包括:db2 Mysql
Mssqlserver sybase等。oid必须为long int 或short类型,如果把oid定义了byte类型那个,则会在运行时候出错。
3.sequence标识符生成器:sequence标识符生成器利用底层数据库提供的徐磊来生成标识符
hiberante在持久化一个User对象时,先从底层数据库的 news sq序列中获取一个唯一的标识符,再把它作为主键值。它的适用范围是:
由于sequence生成标识符的机制依赖于底层数据库的系统的序列。因此要求底层数据库系统必须支持序列。支持徐磊的数据库包括db2.oracle等
oid必须为 long int 或short 类型,如果把oid定义为一个byte类型,在运行时会抛出异常。
4.hilo标识符生成器:hilo标识符生成器由hibernate按照一种high/low算法*生成标识符,它从数据库的特定表的字段红获取high值。
1)hiberante在持久化一个User对象时,有hibernate负责生成主键值,hilo标识符生成器在生成标示符是时,需要读取并修改HI_TABLE的
NEXT_VALUE值。他的适用范围是:由于hilo生成标识符机制不依赖于底层数据库系统的实现,因此它适合所有的数据库系统,
oid必须为 int long 或者short。如果把oid的类型改为short则会抛出异常。
5.native标识符生成器:native会根据底层数据库对自动生成标识符的支持能力来选择使用identity,sequence或hilo标识符生成器。
适用范围是:由于native能根据底层数据库系统的类型自动选择合适的标识符生成器,因此很适合夸数据库平台开发。但oid必须为int long,short不能为byte。
Property属性
=配置<property name="hbm2ddl.auto">属性
在hibernate.cfg.xml配置文件的<session-factory>标签里加入以下内容:
<property name="hbm2ddl.auto">create</property>
<property name="hbm2ddl.auto">的选项有:validate | update | create | create-drop
areate
如果数据库里没这张表,则自动创建。
update
配置文件里的表结构发生改变,重新创建该表。
create-drop
在显式关闭SessionFactory 时,将删除掉数据库 schema。
validate
验证,每次对数据库表作操作时验证是否和映射文件的结构对应上。
映射组成关系
Hibernate把持久话类的属性分为两种
1、值(value)类型:没有OID 不能被单独持久化,生命周期依赖于所属的持久化类的对象的生命周期
2、实体(entity)类型。:有OID可以单独被持久化,有独立的生命周期
eg:如果一个属性是一个类的对象,那么显然无法直接调用<property>映射pay属性。
Hibernate使用<Component>元素来映射组成关系。该元素表明pay属性是work类的一个组成部分,在
Hibernate中称之为组件。
<component name="pay" class="Pay">
<!-- 指定组成关系的组建属性 -->
<property name="monthlyPay" column="MONTHLY_PAY"></property>
<property name="yearPay" column="YEAR_PAY"></property>
<property name="vocationWithPay" column="VOCATIONWITH_PAY"></property>
</component>
持久化对象的状态有:站在持久化的角度,hiberante把对象分为4中状态:持久化状态,临时状态,游离状态,删除状态
Session的特定方法使对象从一个状态转化到另一个状态。
1)临时对象(Transient):
-)在使用代理主键的情况下,oid通常为null。
不处于Session的缓存中
在数据库中没有对应的记录
2)持久化对象(也叫托管)(persist)
OID不为null
位于Session缓存中
若在数据库中已经没有和期对应的记录,持久化对象和数据库中的相关记录对应。
Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库
在同一个Session实例的缓存中,数据库表中的每条记录之对应唯一持久化对象。
3)删除对象(Removed)
在数据库中没有和其oid对应的记录
不在处于Session缓存中
一般情况下,应用程序不该再使用被删除的对象
4)游离对象(也叫“托管”)(Detached):
OID不为null
不再处于Session缓存中
一般情况需游离对象是由持久化对象转变过来的。因此在数据库中可能还存在与他对应的记录。
Hibernate配置文件
hibernate的配置文件主要用于配置数据库连接和hibernate运行时所欲的各种属性,
每个hibernate的配置文件对应一个Configuration对象,
hibernate配置文件可以有两种格式
1)hibernate.cfg.xml
2)hibernate.properties
3.在hibernate中使用C3P0数据源
1)导入jar包
c3p0-0.9.2.1.jar
c3p0-oracle-thin-extras-0.9.2.1.jar
mchange-commons-java-0.2.3.4.jar
2)加入配置项
hibernate.c3p0.max_size:数据库连接池的最大连接数。
hibernate.c3p0。min_size:数据库连接池的最小连接数
hiberante.c3p0.acquire_increment:数据库连接池大众的连接耗尽时,同意石窟获取多少个数据库连接。
hiberante.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内所哟连接对象是否超市,
连接池本身不会把自己从连接池中移除,而是专门有一个线程按照时间间隔来做这件事情。这个先策划能够给你过比较连接对象醉意一次背时用时间和
当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
hibernate.c3p0.max_statemetns:缓存Statement数量对象。
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="c3p0.idle_test_period">2000</property>
<property name="c3p0.max_statements">10</property>
<property name="c3p0.timeout">2000</property>
Pojo的映射文件.hbm.xml
pojo类和管理系数据库之间的映射可以用一个xml文件来映射
hibernante-mapping
类层次:class
主键:id
基本类型:property
实体应用类。many-to-one|one-to-one
集合:set|list|map|array
-one-to-many
-many-to-many
子类:subclass|joined-subclass
其他:component|any等
查询语句:query(用来存放。查询语句,便于对数据库查询的统一管理和优化)
每个hibernate-mapping中可以同时定义多个类,但更推荐为每个类都创建一个单独的映射文件。
在java中代表时间和日期的类型包括:java.util.Date和java.util.Calendar
此外,在jdbcapi中还提供了3个扩展了java.util.Date类子类。java.sql.Date,java.sql.time
和java.sql.Timestamp,这三个类分贝和标准的sql类型的 date
Mapping映射文件
class 下的name="com.test.User"可以换成 <hibernate-mapping package="name="com.test.User"">
如果有多个class标签就不用在一一尽行配置值name属性了
动态更新:dynamic-update="true"
<class name="com.test.User" table="users1" catalog="test" dynamic-update="true" >
更改数据库信息时候,数据库语句只显示更改的字段
eg:只更改username时候, update
test.users1
set
username=?
where
id=?
映射对象标识符
Hiberante使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系。对象的OID和数据表的主键对应
Hibernate通过标识符生成器来为主键赋值。
Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型节省跟多的数据库空间。
在对象--关系映射文件中,<id>元素用来设置对象标识符。<generatror> 子元素用来设定标识符生成器。
Hibernate提供了标识符生成器接口,IdentifierGnerator,并提供 了各种内置实现
id:设定持久化类的oid和表的映射
name:标示持久化类的oid的属性名
column:设置标识符属性的oid属性名(主键字段名)
unsaved-value:若设定了该属性,Hibernate会通过比较持久化类的oid值和该属性值来区分当前持久化类的对象是否为临时对象。
generator:主键生成策略
1.increment(开发时候不建议使用):标识符生成器有hibernate以递增的方式为代理主键赋值,Hibernat会先读取数据表中主键的最大值,而接下
向数据表中插入记录时候,就在读取最大值的基础上加一。它的适用范围:由于increment生存标识符机制不依赖于底层数据库系统。一in次它适合所有的数据库系统,
适用于只有耽搁Hibernate应用进程的访问同一个数据库的场合,在集群环境下不推荐是用,oid必须为long,int 或者为short 如果把oid定义为byte类型。则运行时候会出出现异常
2.inentity标识符生成器:identity标识符生成器有底层数据库来负责生成标识符。它要求底层数据库把主键定义为自动增长的字段类型。
适用范围:由于identity生成标识符的机制依赖于底层数据库系统,因此要求底层数据库系统必须支持泽东整张字段类型。支持自动增长字段类型的数据库包包括:db2 Mysql
Mssqlserver sybase等。oid必须为long int 或short类型,如果把oid定义了byte类型那个,则会在运行时候出错。
3.sequence标识符生成器:sequence标识符生成器利用底层数据库提供的徐磊来生成标识符
hiberante在持久化一个User对象时,先从底层数据库的 news sq序列中获取一个唯一的标识符,再把它作为主键值。它的适用范围是:
由于sequence生成标识符的机制依赖于底层数据库的系统的序列。因此要求底层数据库系统必须支持序列。支持徐磊的数据库包括db2.oracle等
oid必须为 long int 或short 类型,如果把oid定义为一个byte类型,在运行时会抛出异常。
4.hilo标识符生成器:hilo标识符生成器由hibernate按照一种high/low算法*生成标识符,它从数据库的特定表的字段红获取high值。
1)hiberante在持久化一个User对象时,有hibernate负责生成主键值,hilo标识符生成器在生成标示符是时,需要读取并修改HI_TABLE的
NEXT_VALUE值。他的适用范围是:由于hilo生成标识符机制不依赖于底层数据库系统的实现,因此它适合所有的数据库系统,
oid必须为 int long 或者short。如果把oid的类型改为short则会抛出异常。
5.native标识符生成器:native会根据底层数据库对自动生成标识符的支持能力来选择使用identity,sequence或hilo标识符生成器。
适用范围是:由于native能根据底层数据库系统的类型自动选择合适的标识符生成器,因此很适合夸数据库平台开发。但oid必须为int long,short不能为byte。
Property属性
=配置<property name="hbm2ddl.auto">属性
在hibernate.cfg.xml配置文件的<session-factory>标签里加入以下内容:
<property name="hbm2ddl.auto">create</property>
<property name="hbm2ddl.auto">的选项有:validate | update | create | create-drop
areate
如果数据库里没这张表,则自动创建。
update
配置文件里的表结构发生改变,重新创建该表。
create-drop
在显式关闭SessionFactory 时,将删除掉数据库 schema。
validate
验证,每次对数据库表作操作时验证是否和映射文件的结构对应上。
映射组成关系
Hibernate把持久话类的属性分为两种
1、值(value)类型:没有OID 不能被单独持久化,生命周期依赖于所属的持久化类的对象的生命周期
2、实体(entity)类型。:有OID可以单独被持久化,有独立的生命周期
eg:如果一个属性是一个类的对象,那么显然无法直接调用<property>映射pay属性。
Hibernate使用<Component>元素来映射组成关系。该元素表明pay属性是work类的一个组成部分,在
Hibernate中称之为组件。
<component name="pay" class="Pay">
<!-- 指定组成关系的组建属性 -->
<property name="monthlyPay" column="MONTHLY_PAY"></property>
<property name="yearPay" column="YEAR_PAY"></property>
<property name="vocationWithPay" column="VOCATIONWITH_PAY"></property>
</component>