一 hibernate constrained属性的作用
constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响save()和delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用).
增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。
二 还是配置fetch与unique
<many-to-one name="person" column="person_id" fetch="join" lazy="false" unique="true"></many-to-one>
fetch共两个选项:一个是Join,查询时会产生一个left outer join的查询;另一个是select,会有两个select。
unique,唯一键约束;是生成DDL语言时起作用的。比如创建一个数据库表。由于在hibernate中我们有这样的配置:
<property name="hibernate.hbm2ddl.auto">update</property>
这样就可以看到我们配置的作用了。
三 hibernate 一级缓存,session级共享
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放入一级缓存中,注意一级缓存不能控制缓存的数量,因此在大批量操作数据的时候可能会导致内存溢出;可以使用evict,clear方法清除缓存的内容。既然是session级共享,那么当session关闭后,再次访问这个对象时,就需对数据库进行操作。这样也就有了下面的知识二级缓存。
四 hibernate 二级缓存
二级缓存,hibernate没有自己的实现;需要第三方的框架,当然也可以自己实现,但
是一般实现二级缓存比较复杂,我们都采用第三的框架来实现。其复杂性,在于什么时候需要
访问数据库,什么时候需要访问缓存。一个简单的二级缓存,就是自己定义一个hashTable将我们的对象存入其中,每当访问数据库时我们首先去hashTable中根据自己定义的key规则查找我们的对象是否存在,存在则直接获取,反之访问数据库。当然即使配置二级缓存,我们也需要考虑是否这个数据库表是否经常变化,其影响如何。一般一些常量表,我们可以为它配置二级缓存,而一些经常或者需要避免脏数据、幻影读的表我们都不能为其配置二级缓存。
下面以OSCache为例,配置二级缓存!
首先加入包OSCache的包oscache-2.1.jar和common-logging-1.1.1.jar包,当然每个人版本可以不一样。
oscache-2.1.jar在下面路径中
hibernate-distribution-3.6.0.Final\lib\optional\oscache
添加两个配置:
第一个是hibernate.cfg.xml
下面贴出我所以的配置:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">njusc123</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xivadata</property>
<!--告诉hibernate所使用的数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- hibernate自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
<property name="generate_statistics">true</property>
<!-- 或者到类配置文件中加入缓存配置 --><!--
<class-cache usage="read-only" class="com.xiva.hibernate.domain.Person"/>
<class-cache usage="read-only" class="com.xiva.hibernate.domain.IdCard"/> -->
<mapping resource="com/xiva/hibernate/domain/person.hbm.xml"/>
<mapping resource="com/xiva/hibernate/domain/department.hbm.xml"/>
<mapping resource="com/xiva/hibernate/domain/idCard.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Query、Criteria(查询缓存)由于命中率较低,所以Hibernate缺省时关闭;修改cache.use_query_cache为true打开对查询的缓存,并且调用query.setCacheable(true)或criteria.setCacheable(true)。
如何查看配置二级缓存:可以从下面路径找到相关配置,
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
在该文件中查找:Second-level Cache
第二:复制该路径下面的oscache.properties文件到classes目录下面
为某一个对象配置二级缓存有两种方式:第一就是在hibernate.cfg.xml中加入
<class-cache usage="read-only" class="com.xiva.hibernate.domain.Person"/>
或者在hbm文件中配置,当然现实我们都是使用jpa来配置的,由于现在还没有学习到Jpa,现在提供hbm文件如何配置cache
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--表明与数据库关键字有冲突时,可在前面加反引号:` -->
<hibernate-mapping
package="com.xiva.hibernate.domain">
<class name="Person" table="person">
<!-- 配置cache -->
<cache usage="read-only"/>
<id name="id" unsaved-value="0">
<generator class="native"/>
</id>
<property name="name" not-null="true" column="name" />
<property name="password" not-null="true"/>
<property name="birthday"></property>
<component name="address">
<property name="addressLive" column="address01"></property>
<property name="addressHome" column="address02"></property>
</component>
<many-to-one name="department" column="departmentId" not-null="true"></many-to-one>
<!-- lazy="false" class="IdCard" constrained="true" lazy="false"
<one-to-one name="IdCard" property-ref="person"></one-to-one>-->
</class>
</hibernate-mapping>
<cache usage="read-only"/>
这个就是缓存配置。
验证二级缓存命中率:
Statistics st = HibernateUtil.getSessionFactory().getStatistics();
System.out.println("HitCount:" + st.getSecondLevelCacheHitCount());
System.out.println("PutCount:" + st.getSecondLevelCachePutCount());
System.out.println("MissCount:" + st.getSecondLevelCacheMissCount());
这个需要在hibernate.cfg.xml文件中配置<property name="generate_statistics">true</property>
五 分布式缓存与中央缓存
使用缓存的条件
1.读取大于修改。
2.数据量不能超过内存容量。
3.对数据要有独享的控制。
4.可以容忍出现无效数据。
#cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;mcast_send_buf_size=150000;mcast_recv_buf_size=80000):PING(timeout=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800):pbcast.STABLE(desired_avg_gossip=20000):UNICAST(timeout=5000):FRAG(frag_size=8096;down_thread=false;up_thread=false):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)
#cache.cluster.multicast.ip=231.12.21.132
从上面的配置中可以看出OSCache是支持分布式缓存的。为每一台机器配置好需要同步缓存的ip地址,以及端口号;即当某一台机器数据更新后,则会通知其他机器同步OSCache缓存。当然这个对于更新操作多的数据库表而言,开销是很大的。
关于中央缓存,可以采用memcached来实现。
持续更新中...
分享到:
相关推荐
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
在本篇《Hibernate学习笔记》中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate允许开发者以面向对象的方式处理数据库操作,极大地简化了数据存取的复杂性。以下是一些关键知识点: 1....
Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要
《Hibernate学习笔记——马士兵教程解析》 在Java开发领域,ORM(Object-Relational Mapping)框架的使用已经非常普遍,其中Hibernate作为一款优秀的ORM框架,因其强大的功能和易用性深受开发者喜爱。本文将根据马...
这套笔记是我学习Hibernate,进行相关技术点训练时记录下来的,其中包括技术点说明与相关事例,拿出来与大家分享。
### 马士兵Hibernate学习笔记知识点总结 #### 一、课程内容概览 - **HelloWorld**:通过简单的示例程序介绍如何启动一个基于Hibernate的Java项目。 - **Hibernate原理模拟**:解释O/R Mapping的概念及其重要性。 -...
### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...
Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。
**Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...
### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...
### JDBC与Hibernate学习笔记 #### 一、JDBC概述 **1.1 ODBC与JDBC的区别** - **ODBC(Open Database Connectivity)**: 开放式数据库连接是一种开放标准的应用程序接口(API),用于实现数据库应用程序与不同...
### 对象持久化与Hibernate学习笔记 #### 一、对象持久化的概念与重要性 - **定义**: 对象持久化是指将程序中的对象状态存储到持久化存储设备上的过程,以便在程序结束运行后仍然可以保留这些数据。 - **必要性**:...
【hibernate学习笔记】 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。以下是对Hibernate的学习要点的详细解释: 1. **建立第一个Hibernate版本的HelloWorld** - **...
标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...