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

:暂无数据 2026-04-21 04:00:02 0
本篇内容旨在成为您理解hibernate实例教程的实用手册,其中Hibernate的多对一和一对多操作实例将是我们要重点打磨的章节。

本文目录

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

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

   多对一和一对多概念

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

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

   数据库层

  这里面有两个表单 一个CUSTOMER 客户表单 一个是ORDERS 订单表单 生成客户表单 这个是在**LServer里面做的 其实其他都一样 因为逻辑关系在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方法就省去了 同样订单类就是

   publicclassOrder******mentsjava 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 或者用下面这样代码来实现

   Sessi***e=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 王小虎 );对应**L为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.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()
****cuteFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, **LException
{
//执行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()
****cuteFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, **LException
{
//执行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()
****cuteFind(new HibernateCallback()
{
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)
throws HibernateException, **LException
{
//执行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也是支持原生态的**L,也是可以通过select t.name from T_User t where t.id = ? 这种方式获取结果

把复杂的hibernate实例教程Hibernate的多对一和一对多操作实例讲简单,是我们的追求。你的“懂了”,是我们的成就。
本文编辑:admin

更多文章:


split软件怎么用(苹果splitapp怎么使用)

split软件怎么用(苹果splitapp怎么使用)

承接之前对split软件怎么用的讨论,本篇我们将视角下沉,专门来聊聊实操中无法回避的苹果splitapp怎么使用问题,让知识落地。

2026年4月21日 05:00

颜色大全有多少种(颜色有多少种)

颜色大全有多少种(颜色有多少种)

很多朋友初次接触颜色大全有多少种可能会觉得有点陌生,这很正常。今天这篇文章,咱们就一起把颜色有多少种这事儿聊透,希望能帮您理清思路。

2026年4月21日 04:40

****marker循环(****marker生成复杂word时,用循环循环不出来<w:p>标签)

****marker循环(****marker生成复杂word时,用循环循环不出来<w:p>标签)

上一篇文章我们介绍了****marker循环的基础,今天我们将深入其核心环节——****marker生成复杂word时,用循环循环不出来标签,看看它如何承前启后。

2026年4月21日 04:20

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

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

本篇内容旨在成为您理解hibernate实例教程的实用手册,其中Hibernate的多对一和一对多操作实例将是我们要重点打磨的章节。

2026年4月21日 04:00

seek函数(linux lseek函数怎么用)

seek函数(linux lseek函数怎么用)

其实seek函数的问题并不复杂,但是又很多的朋友都不太了解linux lseek函数怎么用,因此呢,今天小编就来为大家分享seek函数的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年4月21日 03:40

this怎么读的英文(一直想问下this这个到底怎么发音啊)

this怎么读的英文(一直想问下this这个到底怎么发音啊)

本文旨在解决您关于this怎么读的英文的两大困惑:一是理清基本概念,二是深入解析一直想问下this这个到底怎么发音啊。内容干练,直奔主题。

2026年4月21日 03:20

echarts立体柱状图(在vue项目中使用echarts制作3d柱状图)

echarts立体柱状图(在vue项目中使用echarts制作3d柱状图)

本文是您理解echarts立体柱状图的最后一站。我们将通过剖析在vue项目中使用echarts制作3d柱状图,帮你打通任督二脉,彻底领悟。

2026年4月21日 03:00

json软件(iosjson中文被转义)

json软件(iosjson中文被转义)

大家好,关于json软件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于iosjson中文被转义的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年4月21日 02:40

企业网站名称及网站简介(名城苏州的网介)

企业网站名称及网站简介(名城苏州的网介)

本文旨在解决您关于企业网站名称及网站简介的两大困惑:一是理清基本概念,二是深入解析名城苏州的网介。内容干练,直奔主题。

2026年4月21日 02:20

日期字符串是什么(sql中取日期的字符串是)

日期字符串是什么(sql中取日期的字符串是)

结合最近的趋势来看,日期字符串是什么的热度持续攀升,而sql中取日期的字符串是作为其核心组成部分,讨论度更是居高不下。

2026年4月21日 02:00

最近更新

颜色大全有多少种(颜色有多少种)
2026-04-21 04:40:03 浏览:0
****marker循环(****marker生成复杂word时,用循环循环不出来<w:p>标签)
2026-04-21 04:20:03 浏览:0
seek函数(linux lseek函数怎么用)
2026-04-21 03:40:03 浏览:0
json软件(iosjson中文被转义)
2026-04-21 02:40:02 浏览:0
热门文章

floatleft是什么意思(displayflex和floatleft的区别)
2026-04-17 04:40:03 浏览:0
android studio怎么使用(android studio怎么使用)
2026-03-25 23:20:01 浏览:0
标签列表