hibernate实例教程(Hibernate的多对一和一对多操作实例)
本文目录
- Hibernate的多对一和一对多操作实例
- hibernate怎么在oracle里插入timestamp 类型的数据,并且能用update set 更新该字段弄个实例啊
- Hibernate.initialize延迟加载,以及CallBack回调怎么用解释+实例
- 关于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/28543hibernate怎么在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 = ? 这种方式获取结果
更多文章:
****marker循环(****marker生成复杂word时,用循环循环不出来<w:p>标签)
2026年4月21日 04:20
hibernate实例教程(Hibernate的多对一和一对多操作实例)
2026年4月21日 04:00
this怎么读的英文(一直想问下this这个到底怎么发音啊)
2026年4月21日 03:20
echarts立体柱状图(在vue项目中使用echarts制作3d柱状图)
2026年4月21日 03:00








