Hibernate实例教程(Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例)

2024-05-30 09:00:03 :28

hibernate实例教程(Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例)

各位老铁们,大家好,今天由我来为大家分享hibernate实例教程,以及Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

本文目录

Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例

Hibernate.initialize持久化时,有时需要动态的改变对象的加载,比如在页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?当《class》元素或者《set》元素的lazy属性为true时,load() or get() or find()加载这些对象时,Hibernate不会马上产生任何select语句,只是产生一个Obj代理类实例,只有在session没有关闭的情况下运行Obj.getXxx()时才会执行select语句从数据库加载对象,如果没有运行任何Obj.getXxx()方法,而session已经关闭,Obj已成游离状态,此时再运行Obj.getXxx()方法,Hibernate就会抛出"Could not initialize proxy - the owning Session was closeed"的异常,是说Obj代理类实例无法被初始化。然而想在Session关闭之前不调用Obj.getXxx()方法而关闭Session之后又要用,此时只要在Session关闭之前调用Hibernate.initialize(Obj)或者Hibernate.initialize(Obj.getXxx())即可,net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显示初始化代理类实例。 在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object proxy) 方法强制加载这样就相当于动态改变为lazy=false。 但在使用时需要注意的一点是:其中的proxy是持久对象的关联对象属性,比如A实体,你要把A的关联实体B也检出,则要写Hibernate.initialize(a.b)。HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式是通过如下两个方法完成: (1)Object execute(HibernateCallback action) (2)List execute(HibernateCallback action) 这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。 做分页:public List findByPage(final String hql, final int offset, final int pageSize) { //通过一个HibernateCallback对象来执行查询 List list = getHibernateTemplate() .executeFind(new HibernateCallback() { //实现HibernateCallback接口必须实现的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //执行Hibernate分页查询 List result = session.createQuery(hql) .setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; }public List findByPage(final String hql , final Object value , final int offset, final int pageSize) { //通过一个HibernateCallback对象来执行查询 List list = getHibernateTemplate() .executeFind(new HibernateCallback() { //实现HibernateCallback接口必须实现的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //执行Hibernate分页查询 List result = session.createQuery(hql) //为hql语句传入参数 .setParameter(0, value) .setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; }public List findByPage(final String hql, final Object values, final int offset, final int pageSize) { //通过一个HibernateCallback对象来执行查询 List list = getHibernateTemplate() .executeFind(new HibernateCallback() { //实现HibernateCallback接口必须实现的方法 public Object doInHibernate(Session session) throws HibernateException, SQLException { //执行Hibernate分页查询 Query query = session.createQuery(hql); //为hql语句传入参数 for (int i = 0 ; i 《 values.length ; i++) { query.setParameter( i, values); } List result = query.setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; }}

关于hibernate的入门实例

这个main函数是利用hibernate在数据库中建表的,如果你hibernate.cfg.xml写的没错,运行之后应该会在数据库中新建User表。

hibernate 直接通过表名,获取字段名及字段类型

hibernate是一个orm面向对象操作的框架,将表映射成一个PO实体类,表的字段映射为PO的字段,表的每一条记录映射为PO的实例。 但是hibernate也是支持原生态的SQL,也是可以通过select t.name from T_User t where t.id = ? 这种方式获取结果

hibernate怎么在oracle里插入timestamp 类型的数据,并且能用update set 更新该字段弄个实例啊

在annotation里,也就是标签用法中,在该属性的get方法上方添加@Temporal(TemporalType.TIMESTAMP) 标签即可,在.hbm.xml文件中配置《property》的type属性,然后选择timestamp类型即可如下: 《class name="Student"》 《id name="id"》 《generator class="sequence"》《/generator》 《/id》 《property name="brithday" type="timestamp"》《/property》 《property name="age"》《/property》 《/class》

Hibernate session的方法的一些说明

  用Hibernate肯定会频繁的用到session 下面就将Hibernate session中一些经常的用方法逐个的解释一下

  Transaction beginTransaction()

  开始一个工作单元并返回一个与之相关Transaction对象 最为事务的开始 通常在需要对数据库进行更改例如save update或delete时使用 在事务结束后需要调用Transaction的mit方法提交更改 该方法必须在Hibernate session关闭之前使用

  void flush() void clear()

  这两个方法通常在一起使用 由于Hibernate有缓存数据的功能 所以当我们要批量查询和批量插入时 会因为大量的缓存而导致内存溢出 所以我们可以在执行批量插入时插入一定数目的数据后调用flush()提交插入 然后调用clear()清空当前Hibernate session内的所有缓存 批量查询同理

  Connection close()

  关闭Hibernate session 同时清空所有的缓存

  Connection connection()

  获取当前Hibernate session使用的JDBC connection

  boolean contains(Object object)

  返回boolean值 判断一个实例是否与当前Hibernate session保持关联 即为持久化状态

  Query createQuery(String queryString)

  返回一个给定HQL语句的Query对象

  SQLQuery createSQLQuery(String queryString)

  返回一个用于执行原生SQL语句的SQLQuery对象

  void delete(Object object)

  删除与该对象关联的数据里内的一条记录 该对象可以是处于持久化状态也可以是处于瞬态但与数据库的记录有id联系 如果该对象的cascade属性为delete或all将会同时删除相关联的数据

  void delete(String entityName Object object)

  不太明白什么意思 占个位

  Connection disconnect()

  断开与session与当前JDBC的连接 如果连接有Hibernate管理 则将连接送回连接池 否则将送回给程序本身

  Object get(Class clazz Serializable id)

  根据指定的实体类以及实体id返回一个实体的实例 如果找不到记录则返回null

  Object get(String entityName Serializable id)

  同上 entity为实体的名字

  String getEntityName(Object object)

  返回一个持久化类的实体名

  Serializable getIdentifier(Object object)

  返回一个被session缓存的实体实例的id

  Query getNamedQuery(String queryName)

  返回一个在映射文件中定义的命名查询的query对象

  SessionFactory getSessionFactory()

  获取生成当前session的SessionFactory

  Transaction getTransaction()

  不说了 地球人都知道

  Object load(Class theClass Serializable id)

  Object load(String entityName Serializable id)

  和get方法一个效果 不同的是该方法在找不到对应记录时会抛出异常

  Serializable save(Object object)

  将一个实体实例持久化 返回该持久化实例的id 在持久化之前必须手动或自动的指派id

  void update(Object object)

  通过给定的分离状态的实例的id更新数据库记录 如果在持久化类中有相同的id则会抛出异常 如果这个实例cascade设置为save update或all是将同时更新所有关联的实例记录

lishixinzhi/Article/program/Java/ky/201311/28676

关于hibernate实例教程到此分享完毕,希望能帮助到您。

hibernate实例教程(Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.