Hibernate 是一个很强大的ORM 框架。
仅仅在 one-to-one中就分 单向关联,使用连接表的单向关联,双向关联,使用连接表的双向关联.
这里以 双向关联为主总结一下。
1 关联文件的书写.
com.isw2.entity.UserBO.java 如下:
public class UserBO extends BaseBO {
private Long userId;
private String userName;
private UserInfoBO userInfoBO;
UserBO.hbm.xml如下;
<class name="com.isw2.entity.UserBO" table="t_user" lazy="true">
<id name="userId" column="userId">
<generator class="native"></generator>
</id>
<property name="userName" column="userName" length="30"
type="string">
</property>
<!-- 多对一中设置 unique = true
<many-to-one name="userInfoBO" cascade="all" column="infoId" unique="true" lazy="proxy"></many-to-one>
-->
<!-- cascade="all" 使用级联更新,fetch="select" 使用单独的语句查询相关联对象 -->
<one-to-one name="userInfoBO" class="com.isw2.entity.UserInfoBO"
cascade="all" fetch="select">
</one-to-one>
</class>
com.isw2.entity.UserInfoBO.java 如下:
public class UserBO extends BaseBO {
private Long userId;
private String userName;
private UserInfoBO userInfoBO;
UserInfoBO.hbm.xml:
<class name="com.isw2.entity.UserInfoBO" table="t_user_info"
lazy="true">
<id name="userId" column="userId">
<generator class="foreign">
<param name="property">UserBO</param>
</generator>
</id>
<property name="userSex" column="userSex" length="2"
type="string">
</property>
<!-- constrained="true" 添加外键约束 -->
<one-to-one name="userBO" constrained="true"
class="com.isw2.entity.UserBO" fetch="select" cascade="all">
</one-to-one>
</class>
2 相关查询.
/**
* 存储对象
*
* @param userBO
* 要save的对象
*/
public void save(UserBO userBO) {
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.beginTransaction();
session.save(userBO);
tr.commit();
session.close();
}
/**
* 查找所有对象
*/
public void findAll() {
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from UserBO");
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
tr.commit();
session.close();
}
/**
* 使用HQL语句查询
*/
public void findByHQL() {
// 连接查询
String hqlString = "select new UserBO(ub.userId,ub.userName,ib) from UserBO ub,UserInfoBO ib where ub.userId = ib.userId";
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery(hqlString);
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
tr.commit();
session.close();
}
/**
* 使用Criteria 查询
*/
public void findByCriteria() {
// DetachedCriteria dc = DetachedCriteria.forClass(UserBO.class);
// DetachedCriteria 是Criteria的离线版
Session session = HibernateSessionFactory.getSession();
Criteria cr = session.createCriteria(UserBO.class);
cr.addOrder(Order.asc("userName"));
// cr.setProjection(Projections.max("userId")); 使用聚集函数
// cr.add(Restrictions.gt("userId", new Long(3)));使用Restrictions
// Criteria crUserInfo = cr.createCriteria("userInfoBO");
// crUserInfo.add(Restrictions.eq("userSex", "男"));使用多表联接查询
List list = cr.list();
for (Object object : list) {
System.out.println(object);
}
session.close();
}
/**
* Example查询
*/
public void findByExample() {
Session session = HibernateSessionFactory.getSession();
UserInfoBO userInfo = new UserInfoBO();
userInfo.setUserSex("男");
Example emample = Example.create(userInfo);
Criteria cr = session.createCriteria(UserInfoBO.class);
cr.add(emample);
List list = cr.list();
for (Object object : list) {
UserInfoBO info = (UserInfoBO) object;
System.out.println(info.getUserBO().toString());
}
session.close();
}
/**
* Cascade = all 级联更新
*/
public void deleteCascade() {
Session session = HibernateSessionFactory.getSession();
UserBO userBO = (UserBO) session.load(UserBO.class, new Long(3));
Transaction tr = session.beginTransaction();
session.delete(userBO);
tr.commit();
session.close();
3 one-to-one 中关延迟加载.
在当前例子中为又向关联,UserBO主表 , UserInfoBO 从表.
首先 one-to-one 中 fetch="select" 是必须的它表示默认不使用连接查询.
但是因为one-to-one 的特殊性,查询UserBO 过程中无法使用延迟加载,UserInfoBO 中则可以使用.(参考http://ch-space.iteye.com/blog/390780)
分享到:
相关推荐
关联管理是Hibernate的另一个亮点,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关系的处理。手册将详细阐述如何配置和使用这些关联,以及懒加载(Lazy ...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
此外,还会讲解一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)的关系映射,以及集合映射(Set、List、Map等)。 查询语言是Hibernate的重要组成部分,手册会深入...
【标题】"Hibernate3.2之HelloWorld"是关于Java持久化框架Hibernate的一个入门教程,主要针对的是Hibernate3.2版本。在这个版本中,Hibernate引入了一些改进和优化,旨在提高性能和开发效率,同时保持其作为对象关系...
7. **Cascading 和 Association**:Hibernate支持级联操作和对象关联,如one-to-one、one-to-many、many-to-one、many-to-many等,手册会详细介绍如何配置和使用这些关联关系。 8. **缓存机制**:Hibernate支持一级...
标题中的"spring3.2+ Hibernate 3.5.4-Final+struts2 整合开发jar包"指的是一个软件开发项目中采用的技术栈,它涵盖了Spring框架的3.2版本、Hibernate ORM框架的3.5.4-Final版本以及Struts2 Web应用框架的2.3.20版本...
在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...
- **一对一映射**:使用`<one-to-one>`标签实现两个实体之间的一对一关系。 - **一对多映射**:通过`<set>`或`<bag>`元素表示一对多的关系。 - **多对多映射**:使用`<set>`元素结合`<key>`和`<many-to-many>`子元素...
在这个例子中,`<one-to-one>`标签定义了一个一对一的关系,其中`constrained="true"`表示当删除用户时,相应的地址也会被删除。 #### 三、高级关系映射 ##### 3.1 一对多关系映射 一对多关系是指一个实体可以...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
在实际开发环境中,如MyEclipse7.5和Hibernate3.2,你还需要配置Hibernate的SessionFactory,创建Session,然后就可以通过Session进行数据的CRUD操作了。在一对多关联中,你可能会遇到懒加载(lazy loading)和立即...
- **一对多映射**:使用 `<one-to-many>` 或 `<many-to-one>` 标签实现。 - **多对多映射**:通过 `<many-to-many>` 标签实现。 ##### 1.3.2 单向关联基于 Set 的映射 - **目的**:展示单向关联的映射方式。 - *...
#### 3.2 使用`<one-to-one>`标签 在XML配置文件中,一对一映射可以使用`<one-to-one>`标签来实现。例如: ```xml <!-- User.hbm.xml --> <one-to-one name="profile" class=...
- **2.2.5.1 一对一(One-to-one)**:使用 `@OneToOne` 注解来定义两个实体Bean之间的一对一关联关系。 - **2.2.5.2 多对一(Many-to-one)**:使用 `@ManyToOne` 注解来定义多对一的关联关系。 - **2.2.5.3 ...
一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...