`
zhouxianglh
  • 浏览: 268170 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(3)Hibernate3.2 中的 one-to-one关系

阅读更多

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)

分享到:
评论

相关推荐

    Hibernate3.2官方中文参考手册

    关联管理是Hibernate的另一个亮点,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关系的处理。手册将详细阐述如何配置和使用这些关联,以及懒加载(Lazy ...

    hibernate3.2中文文档(chm格式)

    21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...

    hibernate3.2官方中文参考手册(pdf版)

    此外,还会讲解一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)的关系映射,以及集合映射(Set、List、Map等)。 查询语言是Hibernate的重要组成部分,手册会深入...

    hibernate3.2之helloword

    【标题】"Hibernate3.2之HelloWorld"是关于Java持久化框架Hibernate的一个入门教程,主要针对的是Hibernate3.2版本。在这个版本中,Hibernate引入了一些改进和优化,旨在提高性能和开发效率,同时保持其作为对象关系...

    Hibernate_3.2中文手册(chm+pdf)

    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包

    标题中的"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(六)多对一关联映射

    在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...

    Hibernate中文手册3.2最新版本

    - **一对一映射**:使用`&lt;one-to-one&gt;`标签实现两个实体之间的一对一关系。 - **一对多映射**:通过`&lt;set&gt;`或`&lt;bag&gt;`元素表示一对多的关系。 - **多对多映射**:使用`&lt;set&gt;`元素结合`&lt;key&gt;`和`&lt;many-to-many&gt;`子元素...

    hibernate关系映射网址

    在这个例子中,`&lt;one-to-one&gt;`标签定义了一个一对一的关系,其中`constrained="true"`表示当删除用户时,相应的地址也会被删除。 #### 三、高级关系映射 ##### 3.1 一对多关系映射 一对多关系是指一个实体可以...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...

    HibernateAPI中文版.chm

    21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...

    Hibernate+中文文档

    21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...

    Hibernate一对多主键关联映射源代码

    在实际开发环境中,如MyEclipse7.5和Hibernate3.2,你还需要配置Hibernate的SessionFactory,创建Session,然后就可以通过Session进行数据的CRUD操作了。在一对多关联中,你可能会遇到懒加载(lazy loading)和立即...

    hibernate文档

    - **一对多映射**:使用 `&lt;one-to-many&gt;` 或 `&lt;many-to-one&gt;` 标签实现。 - **多对多映射**:通过 `&lt;many-to-many&gt;` 标签实现。 ##### 1.3.2 单向关联基于 Set 的映射 - **目的**:展示单向关联的映射方式。 - *...

    Hibernate一对一映射

    #### 3.2 使用`&lt;one-to-one&gt;`标签 在XML配置文件中,一对一映射可以使用`&lt;one-to-one&gt;`标签来实现。例如: ```xml &lt;!-- User.hbm.xml --&gt; &lt;one-to-one name="profile" class=...

    hibernate annotation 中文文档

    - **2.2.5.1 一对一(One-to-one)**:使用 `@OneToOne` 注解来定义两个实体Bean之间的一对一关联关系。 - **2.2.5.2 多对一(Many-to-one)**:使用 `@ManyToOne` 注解来定义多对一的关联关系。 - **2.2.5.3 ...

    Hibernate Annotations 中文文档

    一对一(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. 映射二级表...

Global site tag (gtag.js) - Google Analytics