Hibernate映射
1.@Entity
被该注解修饰的POJO类是一个实体,可以用name属性指定该实体类的名称,系统默认以该类的类名作为实体类的名称。
2.@Table
指定持久化类所映射的表,它的属性包括:
catalog:将表放入指定的catalog中,如果没有指定,则放入默认的catalog中。
name:设置表名。
schema:将表放入指定的schema中,如果没有指定,则放入默认的schema中。
indexes:为持久化类所映射的表设置索引,该属性的值是一个@Index注解数组。包括columnList:设置对哪些列建立索引,name:该索引的名字,unique:该索引是否具有唯一性
uniqueConstraints:设置表的唯一约束
3.@Access
该注解的value属性支持:
AccessType.PROPERTY 使用getter/setter方法访问属性(默认)
AccessType.FIELD 直接通过成员变量来访问属性(不建议)
4.@Column
用于指定某个属性所映射的数据列的详细信息,包括以下常用属性:
name:指定列名
length:指定数据的最大长度,默认值:255
unique:指定该列书否具有唯一约束
insertable:指定该列是否包含在Hibernate生成的insert语句的列列表中,默认值为true
updatable:指定该列是否包含在Hibernate生成的update语句的列列表中,默认值为true
nullable:该列是否允许为null
precision:当列为decimal类型时,该列支持的最大有效数字位数
scale:当列为decimal类型时,该列支持最大支持的小数位数
columnDefinition:该属性的值是一个代表列定义的SQL字符串,指定创建该数据列的SQL语句
5.@Temporal
数据库中表示日期、时间的类型比较多,使用@Temporal指定类型,其value值包括:
TemporalType.DATE TemporalType.TIME TemporalType.TIMESTAMP
6.@Lob,@Basic修饰大数据类型的属性
使用数据库保存图片或者大段文章时,数据库通常会采用Blob,Clob类型的数据列来保存。在持久化类中只要使用@Lob即可。
如:
@Entity
@Table(name="t_person")
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="t_name")
private String name;
@Lob
@Basic(fetch=FetchType.LAZY) //延迟加载,只有在真正需要时才从数据表中加载数据
private byte[] pic;
}
public class test {
public static void main(String[] args) {
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tx=session.beginTransaction();
Person p=new Person();
p.setName("lyy");
File file=new File("logo.jpg");
byte[] content=new byte[(int)file.length()];
new FileInputStream(file).read(content);
person.setPic(content);
session.save(p);
tx.commit();
session.close();
factory.close();
}
}
6.映射主键
@Id修饰属性,注解时无需指定任何属性
指定主键生成策略:使用@GeneratedValue来修饰,它有以下属性:
(1)strategy:包括
GenerationType.AUTO 自动选择最适合底层数据库的主键生成策略,默认值
GenerationType.IDENTITY 对于MySQL,SQL Server这样的数据库,选择自增长的主键生成策略
GenerationType.SEQUENCE 对于Oracle这样的数据库,选择基于Sequence的主键生成策略,应与@SequenceGenerator一起使用
GenerationType.TABLE 使用辅助表来生成主键,应与@TableGenerator一起使用
(2)generator
使用GenerationType.SEQUENCE和GenerationType.TABLE时,该属性引用@SequenceGenerator,@TableGenerator所定义的生成器的名称
@SequenceGenerator属性包括:
name:主键生成器的名称
allocationSize:底层Sequence每次生成主键值的个数
catalog:将底层Sequence放入指定catalog中
schema:将底层Sequence放入指定schema中
initialValue:底层Sequence的初始值
sequenceName:底层Sequence的名称

Session一级缓存
一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存。位于一级缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库中表的记录,这一过程称为清理缓存。
实现原理:Session缓存是由它的实现类SessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象,保持它的生命周期不会结束。
作用:减少数据库访问,从内存中取数据比数据库中要快得多。缓存中的数据与数据库中的同步:缓存会把改变的sql语句合并,减少访问次数。缓存中的对象存在循环关联时,session会保证不出现访问对象图的死循环。
将test部分改为:
@Test
public void test() {
Person p=(Person)session.get(Person.class, 4);
System.out.println(p);
Person p2=(Person)session.get(Person.class, 4);
System.out.println(p2);
}
Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_, person0_.password as password3_0_0_, person0_.birthday as birthday4_0_0_, (select count(*) from t_person) as formula0_0_ from t_person person0_ where person0_.id=?
Person [id=4, name=ert, password=0, birthday=null]
Person [id=4, name=ert, password=0, birthday=null]
只查询一次,第二次查询时会直接先在缓存中找,若找到,就不去数据库中查找了
若改为:
@Test
public void test() {
Person p=(Person)session.get(Person.class, 4);
System.out.println(p);
session.clear();
Person p2=(Person)session.get(Person.class, 4);
System.out.println(p2);
}
Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_, person0_.password as password3_0_0_, person0_.birthday as birthday4_0_0_, (select count(*) from t_person) as formula0_0_ from t_person person0_ where person0_.id=?
Person [id=4, name=ert, password=0, birthday=null]
Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_, person0_.password as password3_0_0_, person0_.birthday as birthday4_0_0_, (select count(*) from t_person) as formula0_0_ from t_person person0_ where person0_.id=?
Person [id=4, name=ert, password=0, birthday=null]
session会缓存通过它获得的持久化对象,如果在同一个session中获得用一条记录多次,将只会发起一条sql语句,其余的都是在缓存中直接返回。
session.evict(p); 只清除p的缓存
在进行批量插入时,缓存中数据量就会很大
@Test
public void test() {
for(int i=0;i<1000;i++){
Person p =new Person("admin"+i,1234+i,new Date());
session.persist(p);
System.out.println(p);
}
}
修改为:
@Test
public void test() {
for(int i=0;i<1000;i++){
Person p =new Person("admin"+i,1234+i,new Date());
session.persist(p);
if(i%10==0){
session.flush(); //可以立即同步持久化状态数据到数据库表
session.clear();
}
System.out.println(p);
}
tx.commit();
}

Hibernate二 映射 注解 一级缓存的更多相关文章

  1. 在Hibernate框架中详谈一级缓存

    在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的 ...

  2. Java实战之02Hibernate-02映射、一级缓存、实体对象状态

    五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...

  3. hibernate框架学习之一级缓存

    l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...

  4. Hibernate 性能优化之一级缓存

     1.一级缓存的生命周期     一级缓存在session中存放,只要打开session,一级缓存就存在了,当session关闭的时候,一级缓存就不存在了   2.一级缓存是依赖于谁存在的      ...

  5. spring管理hibernate,mybatis,一级缓存失效原因

    mybatis缓存:一级缓存和二级缓存 hibernate缓存:一级缓存和二级缓存 关于缓存: 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器, 其作用是为了减少应 ...

  6. Hibernate 持久化对象和一级缓存

    关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...

  7. hibernate关联映射注解

    转自:hibernate annotation注解方式来处理映射关系 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说 ...

  8. hibernate一级缓存

    理解 Hibernate 一级缓存 Hibernate 一级缓存默认是打开,不需要任何的配置.实际上,你无法强制禁止它的使用. 如果你理解了一级缓存实际上和会话是关联的,就很容易理解一级缓存.总所周知 ...

  9. Hibernate一级缓存、二级缓存

    缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,准确说就是一个数据结构中,这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对 ...

随机推荐

  1. 介绍TableView非常不错的一篇文章

    原文:http://blog.csdn.net/fanxiaochuan/article/details/11332775 介绍TableView非常不错的一篇文章: http://www.cocoa ...

  2. 判断PHP数组是否为空的代码

    PHP判断数组为空首选方法:count($arr),size($arr); 复制代码 代码如下: $arr= array(""); echo count($arr); echo s ...

  3. 【POJ2761】【区间第k大】Feed the dogs(吐槽)

    Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...

  4. 使用gSoap规避和修改ONVIF标准类型结构的解析

    ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分 ...

  5. 读书笔记之 - javascript 设计模式 - 单体模式

    单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...

  6. Fedora 21 安装VirtualBox

    注: 所有操作需要root权限  如果不是root用户在下面所有命令前加sudo 装dkms,kernel-devel,makecache: yum install dkms yum install  ...

  7. 深入Java虚拟机读书笔记第五章Java虚拟机

    Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...

  8. 使用PHP预定义变量得到url地址及相关参数

    获取url地址栏参数多种方法:$_SERVER["SERVER_PORT"]//获取端口$_SERVER['HTTP_HOST']//获取域名或主机地址 如www.sina.com ...

  9. coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING

    coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法 coreseek(sphinx)建立索引时提示错误: WA ...

  10. 如何正确的使用uwsgi

    简单的安装过程可以在这里找到,这里主要说一下如何配置uwsgi的服务,将uwsgi服务加入系统进程,你可以使用如下两种方式安装 apt-get apt-get install uwsgi 该命令会自动 ...