Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

绿色网站无广告
会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

框架学习之Hibernate 第十一节 Hibernate知识补充

来源: 未知 分享至:

1.配置文件 hibernate.cfg.xml

 

2.映射文件 hbm.xml

 

重点:主键生成方式

native:根据使用的数据库来确定id的生成方式

如果是插入操作的话,在插入之前就会对数据库进行一次访问来生成下一个id,然后才插入

hilo:高低位方式,一部分是数据库生成的,另一部分是程序生成的,可以保证是不会重复的

foreign:外键引用,通常要和one-to-one标签一起使用

在一对一映射中要指定引用的是哪个表的哪个字段

uuid:UUID的生成方式生成id时不用访问一次数据库,它生成的id肯定是不同的,并且是string

如果插入比较多的话,可以考虑这种方式,但是查询效率会降低,因为比较的是string

 

3.Hibernate的类型

  • 1.<property name=“name” type=“java.lang.String”/>

type可以是hibernate、java类型或者你自己的类型(需要实现hibernate的一个接口)。

  • 2.基本类型一般不需要在映射文件(hbm.xml)中说明,只有在一个JAVA类型和多个数据库数据类型相对应时并且你想要的和hibernate缺省映射不一致时,需要在映射文件中指明类型(如:java.util.Date,数据库DATE,TIME,DATATIME,TIMESTAMP,hibernate缺省会把java.util.Date映射成DATATIME型,而如果你想映射成TIME,则你必须在映射文件中指定类型)。

默认的情况下,如果 java.util.Date   ->  datetime(数据库中)

如果只想保存日期,type设置成date

如果只想保存时间,type设置成time

如果两个都想保存,type设置成timestamp

  • 3.自定义类型,只要实现了接口就行

4.Session和SessionFactory

Session是非线程安全的,生命周期较短,代表一个和数据库的连接,在B/S系统中一般不会超过一个请求;

内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。

SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个系统生命周期内有效;

SessionFactory保存着和数据库连接的相关信息(user,password,url)和映射信息,以及Hibernate运行时要用到的一些信息。

线程安全 意思就是多个地方进行访问同一个数据时,数据是同步的,不会乱的,因为正在访问的那个数据会被锁死,其他人没有办法访问

还有一种线程安全是 static 的,静态的,不会改变的,还有一种就是只读的属性,它们的值是不能够被修改的(final)

 

5. flush时将一级缓存与数据库同步,这个方法Hibernate自己会在相应的时间调用,最好不要自己调用,因为这个方法耗时耗资源

例子:save

 

 

6.大批量处理

大量操作数据时可能造成内存溢出,解决办法如下:

清除session中的数据

for(int i=0;i<100000;i++)      session.save(obj);

for(int i=0;i<100000;i++){

         session.save(obj);

         if(i% 50 == 0){

                   session.flush(); // 一般要在clear之前进行一次flush操作,因为并不知道什么时候修改了数据,所以要在清除缓存之前和数据库进行一次同步

                   session.clear();

         }

}

②用StatelessSession接口它不和一级缓存、二级缓存交互,也不触发任何事件、监听器、拦截器,通过该接口的操作会立刻发送给数据库,与JDBC的功能一样。

StatelessSession s = sessionFactory.openStatelessSession();该接口的方法与Session类似。

Query.executeUpdate()执行批量更新,会清除相关联的类二级缓存(sessionFactory.evict(class))

缺点:可能会造成级联和乐观锁定问题,因为缓存中的数据已被清空了

 

7.拦截器和事件监听

拦截器与事件都是hibernate的扩展机制,Interceptor接口是老的实现机制,现在改成事件监听机制;

他们都是hibernate的回调接口,hibernate在save,delete,update…等会回调这些类。

 

8. SQL查询 和 命名查询

s.createSqlQuery

s.getNamedQuery

命名的sql放置在映射文件中,放置的位置不同(class内或者class外),传递的字符串的参数是不同的

 

9. 不合适使用 Hibernate的场景

①不适合OLAP(On-Line Analytical Processing 联机分析处理),以查询分析数据为主的系统;适合OLTP(on-line transaction processing 联机事务处理)。

联机分析处理 系统总是进行查询统计,没有很好的对象和关系模型,不适合使用 Hibernate

②对于些关系模型设计不合理的老系统,也不能发挥hibernate优势。

③数据量巨大,性能要求苛刻的系统,hibernate也很难达到要求, 批量操作数据的效率也不高。

 

10. 与 JPA 集成 (annotation方式)

①需要添加的包ejb3-persistence.jar, hibernate-entitymanager.jar, hibernate-annotations.jar, hibernate-commons-annotations.jar, jboss-archive-browsing.jar, javassist.jar

②配置文件%CLASSPATH%/META-INF/persistence.xml

③JAVA代码:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory(name);
    //(Name:在persistence.xml中指定。)
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    Tx.begin();
    Em.persist(entity);//remove,merge,find
    Tx.commit();
    Em.close();
    Emf.close();

 

相关的PPT:

幻灯片44

 

幻灯片45

 

幻灯片47

 

幻灯片48

 

幻灯片49


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史