读书人

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

发布时间: 2012-10-25 10:58:58 作者: rapoo

(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 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" 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 column="userSex" length="2"type="string"></property><!-- constrained="true" 添加外键约束 --><one-to-one name="userBO" constrained="true"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)

读书人网 >软件架构设计

热点推荐