Hibernate学习笔记

本文深入探讨Hibernate框架的核心概念和技术要点,包括SessionFactory的作用、持久化对象的定义、对象状态管理及转换方法、Session的刷新机制、分页和批量处理技巧、实体映射策略以及Hibernate与Spring的集成方式。

相关文档: 
 Hibernate
参考文档  v3.0.2    
 http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/

  Hibernate
实践.pdf

 ● 笔记

  
·SessionFactory是数据库编译后的内存映像,多个数据源则需要使用多个SessionFactory。持久化对象(PO)=JavaBean+映射配置文件。所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。
  ·
使用Hibernate的开发者应该总是关注对象的状态(state),不必考虑SQL语句的执行。 这部分细节已经由Hibernate掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。

  ·Hibernate的操作
    The main function of the
Session is to offer create, read and delete operations for instances of mapped entity classes. Instances may exist in one of three states:

transient: never persistent, not associated with any
Session
persistent: associated with a unique
Session
detached: previously persistent, not associated with any
Session

Transient instances may be made persistent by calling
save(), persist() or saveOrUpdate(). Persistent instances may be made transient by calling delete(). Any instance returned by a get() or load() method is persistent. Detached instances may be made persistent by calling update(), saveOrUpdate(), lock() or replicate(). The state of a transient or detached instance may also be made persistent as a new persistent instance by calling merge().

save() and persist() result in an SQL INSERT, delete() in an SQL DELETE and update() or merge() in an SQL UPDATE. Changes to persistent instances are detected at flush time and also result in an SQL UPDATE. saveOrUpdate() and replicate() result in either an INSERT or an UPDATE.

    session.save()/session.persist()        //Persist the given transient instance

    session.createQuery()            HQL
查询
    session.createCriteria()          
根据实体的条件查询
    session.createSQLQuery()       
原生的SQL查询 
           
    session.get()/session.load()    
根据某个实例的持久化标识(id),来装载对象。当不存在指定的对象时候,前者返回null,后者抛出异常。
    sess.delete(cat);    //
delete()的用途是把一个持久实例变成瞬时(transient)
  
    
例如:
    
session.createCriteria()  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();
//Criterion
代表查询条件,由Restrictions类来产生。

 ·Session刷出(flush)
每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为刷出(flush),默认会在下面的时间点执行:

   

  • 在某些查询执行之前
  • 在调用org.hibernate.Transaction.commit()的时候
  • 在调用Session.flush()的时候




·同一个类的多次映射
   
对特定的持久化类,映射多次是允许的。这种情形下,你必须指定entity name来区别不同映射实体的对象实例。(默认情况下,实体名字和类名是相同的。)

·分页
   Hibernate
的分页比较简单,
   Query q = sess.createQuery("from DomesticCat cat");
q.setFirstResult(20);
q.setMaxResults(10);
List cats = q.list();

//
另外,Hibernate还支持可滚动遍历(Scrollable iteration)


·批量处理
    
对于批量处理,需要设置hibernate.jdbc.batch_size 属性(例如=20,同时需要再一定间隔进行session的释放内存。例如
   session.flush();
session.clear();


 ·Hibernate的的实体映射
    
1-N,或者N-N的关系时候,当然就要使用到集合类型(例如bag,list,set等)。而当N-1,或者1-1的时候则不需要使用到集合类型。
    
N-N的关系时候,当然要用到连接表。

 ·Hibernate的事件框架由以下两部分组成
    
拦截器机制:实现Interceptor接口
    
事件监听器:实现LoadEventListener,SaveEventListener等。

 ·
LightWeight J2EE》这本书的第四章Hibernate中关于SQL的例子很好说明了实体的映射关系,代码见附件SQL08-02-01_22.rar

·HQL
    HQL中可以是用new操作符,参见: HQL获取部分的实体对象属性


 ·占位符的查询
    HQL
的方式:
    from User u where u.name=:username and u.yearold=:yearold
这就是一个常见的简单值的占位符式的查询,通过这样的方式就可以把值注入到
参数中:
query.setParameter(“username”,”bluedavy”);
query.setParameter(“yearold”,25)

    SQL的方式:
    from User u where u.name=? and u.yearold=?
query.setParameter(0,”bluedavy”);
query.setParameter(1,25);

    SQL查询进行实体映射时,应该尽量用占位符{}
    sess.createSQLQuery("SELECT {cat.*}, {mother.*}  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
 .addEntity("cat", Cat.class)
 .addEntity("mother", Cat.class)


 ·Hibernate之前的很多ORM产品不能像SQL一样只获取需要的东西。所以要合理设置相关属性(Property或者集合或者映射等)LazyLoad,Hibernate3默认LazyLoad的属性值就是true。只有调用到相关属性时才会从缓存或数据库中加载。当然,集合也是同样如此。

 ·
inverse="true" 设置的谨慎
   User
Rolen-n单向关联,如果设置了inverse="true".则当保存UserRole时,不会保存相应的连接表
   (?)
是不是n-n双向关联的时候,才需要设置该值?

 

 · hibernate对实体的操作是需要跟事务关联,如果没有执行事务的commit(),则不会将其持久化到数据库中。

 

 ·hibernatespring集成时,将DAO类继承自HibernateDaoSupport,然后通过getHibernateTemplate()方法来实现CRUD操作则不需要直接管理session和事务。


 

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
提供了一套完整的基于51单片机的DDS(直接数字频率合成)信号波形发生器设计方案,适合电子爱好者、学生以及嵌入式开发人员学习和实践。该方案详细展示了如何利用51单片机(以AT89C52为例)结合AD9833 DDS芯片来生成正弦波、锯齿波、三角波等多种波形,并且支持通过LCD12864显示屏直观展示波形参数或状态。 内容概述 源码:包含完整的C语言编程代码,适用于51系列单片机,实现了DDS信号的生成逻辑。 仿真:提供了Proteus仿真文件,允许用户在软件环境中测试整个系统,无需硬件即可预览波形生成效果。 原理图:详细的电路原理图,指导用户如何连接单片机、DDS芯片及其他外围电路。 PCB设计:为高级用户准备,包含了PCB布局设计文件,便于制作电路板。 设计报告:详尽的设计文档,解释了项目背景、设计方案、电路设计思路、软硬件协同工作原理及测试结果分析。 主要特点 用户交互:通过按键控制波形类型和参数,增加了项目的互动性和实用性。 显示界面:LCD12864显示屏用于显示当前生成的波形类型和相关参数,提升了项目的可视化度。 教育价值:本资源非常适合教学和自学,覆盖了DDS技术基础、单片机编程和硬件设计多个方面。 使用指南 阅读设计报告:首先了解设计的整体框架和技术细节。 环境搭建:确保拥有支持51单片机的编译环境,如Keil MDK。 加载仿真:在Proteus中打开仿真文件,观察并理解系统的工作流程。 编译与烧录:将源码编译无误后,烧录至51单片机。 硬件组装:根据原理图和PCB设计制造或装配硬件。 请注意,本资源遵守CC 4.0 BY-SA版权协议,使用时请保留原作者信息及链接,尊重原创劳动成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值