hibernate要点

hibernate主要知识点 hibernate主要知识点归纳,学习hibernate时自己总结的,还不错的东西,给大家分享下 立即下载

最近在研究hibernate,在这里记录一些要点项,版主就54下吧。

转自飞茂的blog(网上搜索意外发现的,如果有版权问题,请pm我,我会删除)

1.两种配置文件:   A.hibernate.cfg.xml   和   B.hibernate.properties

  A中可含映射文件的配置,而B中hard codes加映射文件。

  A。Configuration config=new Configuration().config();   B. Configuration config=new Configuration();      config.addClass(TUser.class);

2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名,    你也不一定非得把配置文件放在Classes下,    File file=new File("c://sample//myhibernate.xml");    Configuration config=new Configuration().config(file);

3. session.Flush()    强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush    在session关闭时也会调用flush

4. Hibernate总是使用对象类型作为字段类型

5. XDoclet专门建立了hibernate doclet,就是在java代码上加上一些    java docTag,后来再让XDoclet分析该java代码,生成映射文件;

6.HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

7.关系:   Constrained : 约束,表明主控表的主键上是否存在一个外键(foreigh key)    对其进行约束。

  property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名

  单向一对多需在一方配置,双向一对多需在双方进行配置

8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控方指定的   Collection类型属性中

9. java.util.Set或net.sof.hibernate.collecton.Bag类型的Collection

10.重要:inverse:用于标识双向关联中的被动方一端。          inverse=false的一方(主控方)负责维护关联关系.默认值:false

11.batch-size:采用延迟加载特征时,一次读入的数据数昨。

12.一对多通过主控方更新(主控方为一方时)

   user.getAddresses().add(addr);    session.save(user);//通过主控对象级联更新  

13.在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能    的改善。在一方设置关系时,inverse=true,即将主控权交给多方,    这样多方可主动从一方获得foreign key,然后一次insert即可完工。

   addr.setUser(user);//设置关联的TUser对象    user.getAddresses().add(addr);    session.save(user);//级联更新  

14.只有设为主控方的一方才关心(访问)对方的属性,被动方是不关心对方的属性的。

15.one-to-many与many-to-one节点的配置属性不同:    一对多关系多了lazy和inverse两个属性    多对多节点属性:column:中间映射表中,关联目标表的关联字段                    class:类名,关联目标类                    outer-join:是否使用外联接    

   注意:access是设置属性值的读取方式。

        column是设置关联字段。

16.多对多,注意两方都要设置inverse和lazy,cascade只能设为insert-update    多对多关系中,由于关联关系是两张表相互引用,因此在保存关系状态时必须对双方同时保存。

   group1.getRoles().add(role1);    role1.getGroups().add(group1);

   session.save(role1);    session.save(group1);

17.关于vo和po    vo经过hibernate容量处理,就变成了po(该vo的引用将被容器保存,并且在session关闭时flush,因此po如果再传到其它地方改变了,就危险了)       vo和po相互转换:BeanUtils.copyProperties(anotherUser,user);

18.对于save操作而言,如果对象已经与Session相关联(即已经被加入Session的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate 会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成并执行相应的update 语句。

19.如果我们采用了延迟加载机制,但希望在一些情况下,实现非延迟加 载时的功能,也就是说,我们希望在Session关闭后,依然允许操作user的addresses 属性 Hibernate.initialize方法可以通过强制加载关联对象实现这一功能: 这也正是我们为什么在编写POJO时,必须用JDK Collection接口(如Set,Map), 而非特定的JDK Collection实现类(如HashSet、HashMap)申明Collection属性的 原因。

20.事务:从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了jdbc操作,如果不显式调用session.BeginTransaction(),是不会执行事务操作的。

   jdbc transaction:基于同一个session(就是同一个connection)的事务;    jta  transaction:跨session(跨connection)事务.

   对于jta事务,有三种实现方法:      A。UserTransaction tx=new InitialContext().lookup("...");         tx.commit();      B. 使用hibernate封装的方法:(不推荐)         Transaction tx=session.beginTransaction();         tx.commit();      C. 使用ejb之sessionBean的事务技持方法,你只要在把需要在发布描述符中,把需要jta事务的方法声明为require即可

21.悲观锁,乐观锁:    乐观锁一般通过version来实现,注意version节点必须出现在id后。

22.Hibernate中,可以通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围。    Query接口中也提供了与其一致的方法,hibernate主要在dialect类中实现在这个功能。

23.cache    <hibernate-configuration> <session-factory> ……   <property name="hibernate.cache.provider_class">    net.sf.ehcache.hibernate.Provider   </property>  

  还需对ecache本身进配置   <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" //Cache中最大允许保存的数据数量 eternal="false" //Cache中数据是否为常量 timeToIdleSeconds="120" //缓存数据钝化时间 timeToLiveSeconds="120" //缓存数据的生存时间 overflowToDisk="true" //内存不足时,是否启用磁盘缓存 />   </ehcache>

  之后在映射文件中指定各个映射实体的cache策略   <class name=" org.hibernate.sample.TUser" .... > <cache usage="read-write"/> .... <set name="addresses" .... >   <cache usage="read-only"/> .... </set> </class>

***************************************************** Query.list()跟Query.iterate()的不同: 对于query.list()总是通过一条sql语句获取所有记录,然后将其读出,填入pojo返回; 但是query.iterate(),则是首先通过一条Select SQL 获取所有符合查询条件的记录的 id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记 录,之后填入POJO中返回。

也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1 条SQL。,list方法将不会从Cache中读取数据。iterator却会。

24.ThreadLocal:它会为每个线程维护一个私有的变量空间。实际上, 其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是 线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时, ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回。

这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开 来。

25.Hibernate官方开发手册标准示例:   public class HibernateUtil { private static SessionFactory sessionFactory; static { try { // Create the SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (HibernateException ex) { throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex ); } } public static final ThreadLocal session = new ThreadLocal(); public static Session currentSession() throws HibernateException { Session s = (Session) session.get(); // Open a new Session, if this Thread has none yet if (s == null) { s = sessionFactory.openSession(); session.set(s); } return s; } public static void closeSession() throws HibernateException { Session s = (Session) session.get(); session.set(null); if (s != null) s.close(); } }  

     26.通过filter实现session的重用:    public class PersistenceFilter implements Filter { protected static ThreadLocal hibernateHolder = new ThreadLocal(); public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { hibernateHolder.set(getSession()); try { …… chain.doFilter(request, response); …… } finally { Session sess = (Session)hibernateHolder.get(); if (sess != null) { hibernateHolder.set(null); try { sess.close(); } catch (HibernateException ex) { throw new ServletException(ex); } } } } ……}

27.Spring的参数化事务管理功能相当强大,笔者建议在基于Spring Framework的应用 开发中,尽量使用容器管理事务,以获得数据逻辑代码的最佳可读性。    public class UserDAO extends HibernateDaoSupport implements IUserDAO { public void insertUser(User user) { getHibernateTemplate().saveOrUpdate(user); } }

  上面的UserDAO实现了自定义的IUserDAO接口,并扩展了抽象类: HibernateDaoSupport HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联。 HibernateTemplate对Hibernate Session操作进行了封装,而 HibernateTemplate.execute方法则是一封装机制的核心

  *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。

Hibernate重点总结 Hibernate重点总结,推荐大家看看,我觉得还总结的不错,不妨下下来看看。 立即下载

相关推荐

Hibernate知识点总结大全

day1 一. hibernate数据持久化组件 对象持久化(Object Persistence):把数据保存在永久存储介质中(数据库) 1.为什么要持久化: a.内存是暂时存储设备,断电后数据易丢失 b.网络传输无法传输内存中的对象,需要将对象外化 c.内存中数据查询,组织不方便 d.内存只能存储少量数据 2.怎样持久化 a.对象序列化 --&gt; 二进制流 ...

wangminshe89 364

Hibernate框架常用知识点总结

Hibernate配置详解 Hibernate核心详解 Hibernate事务详解 Hibernate多表关系详解

宏微的博客 1万+

hibernate知识点

对象-关系映像:Object Relational Mapping 简称 ORM 含义:用来把域模型表示的对象映像到关系数据模型对应的数据库中 Hibernate 1.在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架; 2.Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架; 3.Hibernate...

FWWQS的博客 302

hibernate要点(转载)

hibernate要点关键词: hibernate                                           1.两种配置文件:   A.hibernate.cfg.xml   和   B.hibernate.properties   A中可含映射文件的配置,而B中hard codes加映射文件。  A。Configuration config=new Configura

Badboy的专栏 822

Hibernate要点

1.两种配置文件:    A.hibernate.cfg.xml   和   B.hibernate.properties    A中可含映射文件的配置,而B中hard codes加映射文件。   A。Configuration config=new Configuration().config();    B. Configuration config=new Configuration(); 

soleghost的专栏 1484

Hibernate要点总结

1、什么是Hibernate     1)Hibernate是数据访问层的框架,对JDBC进行了封装,是针对数据访问层的面向对象的解决方案。     2)Hibernate允许我们直接访问对象,然后将访问自动转化为SQL去执行,从而达到间接访问数据库的目的,简化代码开发,提升开发效率。 2、为什么使用Hibernate     1)使用JDBC开发出现的问题         --

厚积而薄发,谋定而后动 5208

Hibernate总结要点

概念:针对数据库的持久化框架,帮助完成对数据库的增删改查工作 重点:ORM 开发步骤: 1.配置环境:导入jar包,目前共17个; 2.Build path; 3.创建实体Bean,声明对象中的属性,并生成get,set方法;注意点:不要使用基本数据类型,要使用包装类型; 4.配置实体类和数据库表的映射关系;建议映射文件名为实体类名称.hbm.xml; 5.引入外部映射文档:

u012994320的博客 323

Hibernate程序性能优化的考虑要点

Hibernate程序性能优化的考虑要点  本文依照HIBERNATE帮助文档,一些网络书籍及项目经验整理而成,只提供要点和思路,具体做法可以留言探讨,或是找一些更详细更有针对性的资料。  初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。  大体上,对于HIBERNAT

成武超的专栏 463

hibernate 优化要点

Robbin总结的Hibernate性能优化要点: 1.尽量使用many-to-one,避免使用单项one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态 HQL:from object polymorphism="exlicit" ...

lvpeng8357的专栏 158

Hibernate性能优化要点

Robbin总结的Hibernate性能优化要点: 1.尽量使用many-to-one,避免使用单项one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态  HQL:from object  polymorphism="exlicit" 避免查处所有对象 7...

liangwang 210

Hibernate 要点

Hibernate 如果采用 ThreadLocal 的session .在事务被提交后系统会自动关闭session. Hibernate中对于字典代码的关系问题,有一个比较简单的配置方法. 使用formula, filter, subselect http://dev2dev.bea.com.cn/techdoc/20060109720.html xml 代码...

ryudoooo的博客 132

Robbin总结的Hibernate性能优化要点

Robbin总结的Hibernate性能优化要点:1.尽量使用many-to-one,避免使用单项one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态  HQL:from object  polymorphism="exlici

clz1314521的专栏 881
上一篇: 关于java类中变量中字符国际化的两种解决方法
下一篇: 关于薪资问题的小知识-个人所得税,四险一金
friendggz
博客等级 码龄23年 9粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值