Hibernate实例教程(Hibernate的多对一和一对多操作实例)

2024-02-28 04:30:02 :41

hibernate实例教程(Hibernate的多对一和一对多操作实例)

这篇文章给大家聊聊关于hibernate实例教程,以及Hibernate的多对一和一对多操作实例对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

Hibernate的多对一和一对多操作实例

  Hibernate 《》的一对多和多对一操作真的很方便 如果系统采用Hibernate作为持久层 完全可以把对应的一对多和多对一逻辑关系放在Hibernate里面控制 减少数据库的负担 而且也更清晰

   多对一和一对多概念

  其实这个概念上来说很简单 比如一个客户可以有多个订单 多个订单属于同一个客户 就是最基本的一对多 和多对一 数据库使用中 感觉多对一和一对多算是比较常见的逻辑关系了

  我曾经做过一些数据库 比如某些 *** 部门的 其表单很设计的很简单粗糙 甚至连主键都没有 完全靠在事务层补全这些关系 其实通过Hibernate持久层来实现逻辑关系也是很不错的方法 下面的例子 就是数据库逻辑上基本没有定义 主要放在持久层里面 这个也主要是我对数据库操作属于半通水的原因

   数据库层

  这里面有两个表单 一个CUSTOMER 客户表单 一个是ORDERS 订单表单 生成客户表单 这个是在SQLServer里面做的 其实其他都一样 因为逻辑关系在Hibernate上面 id是主键非空 其他可以为空

   CREATETABLE(

   ( )NOTNULL

   ( )NULL

   NULL

   CONSTRAINTPRIMARYKEY)

  订单表单

  id为主键非空 CUSTOMER_id是对应客户主键 也非空 这里不做外键设置

   CREATETABLE(

   ( )NULLPRIMARYKEY

   ( )NOTNULL

   ( )NULL

   ( )NULL

   )

   Hibernate设定

  HIbernate里面 一对多的对象体现 是客户有一个集合set set里面放著对应订单 而多对一体现 是订单里面有一个CUSTOMER对象 表明该订单所属的客户 其中 CUSTOMER类为

   publicclassCustomerimplementsjava io Serializable{

   privateLongid;

   privateStringname;

   privateIntegerage;

   privateSetrderses=newHashSet();

  

   }

  后面的getXXX和setXXX方法就省去了 同样订单类就是

   publicclassOrdersimplementsjava io Serializable{

   privateLongid;

   privateCustomercustomer;

   privateStringorderNumber;

   privateDoubleprice;

  

   }

  而对应hbm文档 就是map文档如下

   CUSTOMER hbm xml

   《!DOCTYPEhibernate mappingPUBLIC //Hibernate/HibernateMappingDTD //EN

   mapping dtd 》

   《!

   MappingfileautogeneratedbyMyEclipsePersistenceTools

   》

   《hibernate mapping》

   《classnameclassname= onetomany Customer table= CUSTOMER schema= dbo catalog= DBTEST 》

   《idnameidname= id type= java lang Long 》

   《columnnamecolumnname= id precision= scale= /》

   《generatorclassgeneratorclass= increment /》

   《/id》

   《propertynamepropertyname= name type= java lang String 》

   《columnnamecolumnname= name length= /》

   《/property》

   《propertynamepropertyname= age type= java lang Integer 》

   《columnnamecolumnname= age /》

   《/property》

   《setnamesetname= orderses inverse= true lazy= true cascade= all 》

   《key》

   《columnnamecolumnname= CUSTOMER_id precision= scale= not null= true /》

   《/key》

   《one to manyclassone to manyclass= onetomany Orders /》

   《/set》

   《/class》

   《/hibernate mapping》

  这个里面 其他都很简答了 其中《generatorclass= increment /》表示主键值自动增加 这个主要针对字符串对应的 主要体现多对以的是

   《setnamesetname= orderses inverse= true lazy= true cascade= all 》

   《key》

   《columnnamecolumnname= CUSTOMER_id precision= scale= not null= true /》

   《/key》

   《one to manyclassone to manyclass= onetomany Orders /》

   《/set》

  其中 set表示 对应集合 fetch和lazy主要是用来级联查询的 而cascade和inverse主要是用来级联插入和修改的 这几个主要包括对集合的控制 《one to manyclass= onetomany Orders /》表示对应类 即set里面包含的类 而key主要是用于确定set里面对应表单列

   ORDERS的hbm

   《?xmlversionxmlversion= encoding= utf ?》

   《!DOCTYPEhibernate mappingPUBLIC //Hibernate/HibernateMappingDTD //EN

   mapping dtd 》

   《!

   MappingfileautogeneratedbyMyEclipsePersistenceTools

   》

   《hibernate mapping》

   《classcatalogclasscatalog= DBTEST name= onetomany Orders schema= dbo table= ORDERS 》

   《idnameidname= id type= java lang Long 》

   《columnnamecolumnname= id precision= scale= /》

   《generatorclassgeneratorclass= increment /》

   《/id》

   《many to oneclas *** any to oneclass= onetomany Customer fetch= select name= customer 》

   《columnnamecolumnname= CUSTOMER_id precision= scale= /》

   《/many to one》

   《propertygeneratedpropertygenerated= never lazy= false name= orderNumber type= java lang String 》

   《columnlengthcolumnlength= name= ORDER_NUMBER /》

   《/property》

   《propertygeneratedpropertygenerated= never lazy= false name= price type= java lang Double 》

   《columnnamecolumnname= PRICE precision= scale= /》

   《/property》

   《/class》

   《/hibernate mapping》

   《many to oneclas *** any to oneclass= onetomany Customer fetch= select name= customer 》

   《columnnamecolumnname= CUSTOMER_id precision= scale= /》

   《/many to one》

  表示CUSTOMER熟悉对应的类 和其作为key的列名 上面这些都可以在MyEclipse里面自动生成 另外注意的一点是 在生成的DAO里面 涉及表单操作的save()和delete()方法 必须要事件提交 数据库才有反映 可以就该Hibernate xml 或者用下面这样代码来实现

   Sessionse=getSession();

   Transactiontx=se beginTransaction();

   se delete(persistentInstance);

   //se save(instance);

  mit();

   验证效果

   新增用户

  如果新增一个用户 该用户里面包含有两个表单 那么 由于持久层已经实现了逻辑关系 只要用户类里面的set包含了表单 则表单可以自动增加 实现代码

   CustomerDAOcd=newCustomerDAO();

   Customerxd=newCustomer( 王小虎 null);

   Ordersord =newOrders();

   ord setCustomer(xd);

   ord setOrderNumber( 王小虎的买单 );

   Ordersord =newOrders();

   ord setCustomer(xd);

   ord setOrderNumber( 王小虎的买单 );

   Setrderses=newHashSet();

   orderses add(ord );

   orderses add(ord );

   xd setOrderses(orderses);

   cd save(xd);

  代码里面 加入一个王小虎用户 两个订单 通过setOrderses加入 只使用cd save这一个对持久层操作 完成后查询

   王小虎

   =================================

   王小虎的买单

   王小虎的买单

  显示 CUSTOMER里面加入了王小虎 ORDERS里面也加入他的订单

   删除操作

   List《Customer》csList=cd findByProperty( name 王小虎 );

   for(Customercs:csList){

   cd delete(cs);

   }

  这个很简单了 通过其中findByProperty( name 王小虎 );对应SQL为deletefromtableCUSTOMERwherename= 王小虎 ;删除了王小虎 而ORDERS里面 王小虎对应的表单也同时被删除

   小小总结

lishixinzhi/Article/program/Java/ky/201311/28543

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的入门实例

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

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.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实例教程和Hibernate的多对一和一对多操作实例的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

hibernate实例教程(Hibernate的多对一和一对多操作实例)

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

鲁ICP备20007704号

Thanks for visiting my site.