随笔-61  评论-159  文章-0  trackbacks-0

在hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid,
component可以成为是值对象(DDD)

采用component映射的好处:它实现了对象模型的细粒度划分,层次会更分明,复用率会更高。

例子:一个用户类,包含比较多的用户信息,姓名、地址、电子邮件、邮编、电话等等,因此这样如果只集中一个POJO类的话,就造成对象模型的力度比较粗,因此有必要重新划分对象粒度,提供程序运行效率。

因此把User划分为User和Contact两个类

1、User的POJO类

public class User {
 private int id;
 private String name;
 private Contact contact;

//省略setter、getter方法
}
2、从User中划分出来的Contact类

public class Contact {
 private String email;
 private String address;
 private String zipCode;
 private String contactTel;

//省略setter、getter方法
}
3、User的映射文件User.hbm.xml

 1<?xml version="1.0"?>
 2<!DOCTYPE hibernate-mapping PUBLIC 
 3    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5<hibernate-mapping package="org.apple.hibernate">
 6    <class name="User" table="t_user">
 7        <id name="id">
 8            <generator class="native"/>
 9        </id>
10         <property name="name"/>
11         <component name="contact">
12             <property name="email"/>
13             <property name="address"/>
14             <property name="zipCode"/>
15             <property name="contactTel"/>
16         </component>
17    </class>
18</hibernate-mapping>

4、数据库表结构:

mysql> desc t_user;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id              | int(11)           | NO    | PRI | NULL   | auto_increment |
| name         | varchar(255) | YES  |        | NULL    |                         |
| email         | varchar(255) | YES  |        | NULL    |                         |
| address     | varchar(255) | YES  |        | NULL    |                         |
| zipCode    | varchar(255) | YES  |        | NULL    |                         |
| contactTel | varchar(255) | YES  |        | NULL    |                         |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.02 sec)

5、测试方法:
 1public void testSave1()
 2    {
 3        Session session = null;
 4        try {
 5            session = HibernateUtil.getSession();
 6            session.beginTransaction();
 7            User u = new User();
 8            u.setName("张三");
 9            Contact contact = new Contact();
10            contact.setAddress("********");
11            contact.setEmail("*****@163.com");
12            contact.setZipCode("000000000");
13            contact.setContactTel("1234567890");
14            u.setContact(contact);
15            session.save(u);
16            session.beginTransaction().commit();
17        }
 catch (Exception e) {
18            e.printStackTrace();
19            session.beginTransaction().rollback();
20        }
finally{
21            session.close();
22        }

23        
24    }

PS、由于Contact没有映射文件,在User中使用了Component映射标签,加入Contact里面的属性,所以在测试方法里面不用调用session.save(contact);,只调用第15行中的u.setContact(contact);即可。

-------------------------------------------------------------------------------------------------
PS:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必注明作者文章的详细出处地址,否则不允许转载,多谢合作!
posted on 2008-10-23 23:19 apple0668 阅读(687) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: