Hibernate学习笔记

来源:互联网 发布:js替换字符串中的数字 编辑:程序博客网 时间:2024/05/21 09:03

MyeclipseHibernate环境搭建过程

0 :  连续使用方法的编程风格叫做方法链编程风格。

1首先选择Properties建立一个用户库

2Hibernate下的lib库中所有第三方jar包导入到该库中

3Hibernate下的核心Hibernate3.jar包导入到该库中

4将数据库驱动jdbc导入到该库中

5Hibernateetc/Hibernate.property配置文件导入到工程的classpath目录下

6:将实体关系模型的配置文件加入到核心配置文件当中

7:将log4j配置文件导入到src下有助于查看详细的hibernate执行过程

   

关键类的解释及使用Hibernate创建数据库表的顺序

Configurationcfg=new Configuration().config(); 

//读取Hibernate.cfg.xml配置文件的数据放入对象cfg若不调用方法config()则默认读取Hibernate.properties配置文件中的数据

SessionFactory  factory=cfg.builSessionFactory();

// 返回一个SessionFactory类对象,此类包含生成sql语句的核心代码,且是线程安全的只生成一次

Sessionsession=factory.openSeesion();

//每次生成一个Session对象,都应该在用完之后立即关闭,且每一个线程都有一个自己的session,该对象与Connection相关联,打开此对象时应捕获异常处理,并且使用Session与数据库进行操作时的顺序如下:

1Session.beginTransaction()

   //打开一个事务

2:实例化一个对象模型,

   //此时的对象为Transient状态 

3Session.save(Object);        

//此时的对象为Presisent状态,执行完后id在此时生成,此时修改对象中属性,session会检查缓存,并将所有对对象模型的修改通过sql语句数据库同步。

4session.getTransaction().commit();//此时的对象为detached状态,处于离线状态即对象模型不在session中,但是session会在缓存中保存一个数据快照,当再次把对象模型纳入session中时,session会和缓存中快照对比,如果有相同的id则生成更新语句,而不是生成插入语句。

 

5:session.get(Class clazz,”id”); //此方法用来查询数据库中的数据,并返回一个持久化的对象或空值。

 

6session.load(User.class,”id”);//此方法采用延迟加载机制加载,意思是只有当使用对象模型中的数据的时候才执行sql语句与数据库打交道。这是和session.get(Class clazz,”id”);方法最重要的区别。

 

7: 执行Session.save(Object);//当执行该方法的时候,对象变为持久状态,即可以认为已经生成sql插入语句,数据库中已经存在该行数据。在多对一关联时,执行完该方法就发送sql语句,没有相关联的时候是当清理缓存的时候再发送该语句。

8: 执行Session.getTransaction().commit();//当执行该方法时,会检查缓存,和对象比对是否发生改变,若改变则与数据库同步。

9: 执行多对一的关联映射时,应该将每个对象都变成持久化对象,持久化是每个对象都存入数据库,然后Hibernate从数据库中取出相应的Id

10:cascade=”save-update”

// 级联影响的只是删除,修改,增加,不影响查询。

11: 一对一对象数据关联.    

 主键生成方式为

 <generator class=”foreign”>//foreign的意思是采用外键生成主键

<paramname=”property”>关联对象</param>

 </generator>

<one-to-onename=”关联对象”constraint=”true”/> //只影响加载不影响保存。属性property-ref=”外键字段名表示查询的时候根据外键查找。

 

12:Session一关闭,则代理机制失效,如果要使Session一直有效则需要将其放入Filter域中

13: 在实体对象查询过程中,如果要使用select则必须使用别名。使用Session进行查询时,创建查询的语句createQuery().iterate()方法会返回一个结果集的迭代器,此迭代器进行查询时会先发一条查询id的语句,之所以这样是因为它先将查询的到Id和缓存做比较,如果存在已经查询到的对象则不再发送sql语句,如果不存在则比较一条发送一条,这就是N+1问题。在默认情况下,每次执行session.createQuery().list()查询实体对象都会发送SQL语句,而不利用缓存中的数据。

14:条件查询:占位符的使用规则,Session.createQuery(“sql语句”).setParameter(intposition,Object val) 参数position表示占位符的排列序号,val表示占位符所要表达的条件。


1 0
原创粉丝点击