考虑这么一个对象类别:
User.java package onlyfun.caterpillar; public class User { private String id; private String name; private char sex; private int age; private String address; ........ } 我们建立一个数据库表格与这个类别作对应: create table USER ( ID char(32) not null, NAME varchar(16) not null, SEX char(1), AGE integer, ADDRESS varchar(255) not null, primary key (ID) ); 这样的对应,您可以依照之前所介绍过的主题来撰写映像文件达成,然而现在我们想要将address属性以一个自订对象Email表示,以便我们将这个自订对象当作辅助对象,在适当的时候,我们可以直接呼叫Email对象的sendMail()方法,也就是说,我们的User类别变成: User.java package onlyfun.caterpillar; public class User { private String id; private String name; private char sex; private int age; private Email email; public int getAge() { return age; } public String getId() { return id; } public String getName() { return name; } public char getSex() { return sex; } public Email getEmail() { return email; } public void setAge(int i) { age = i; } public void setId(String string) { id = string; } public void setName(String string) { name = string; } public void setSex(char c) { sex = c; } public void setEmail(Email email) { this.email = email; } } 而我们新增的Email类别设计如下: Email.java package onlyfun.caterpillar; public class Email { private String address; public void setAddress(String address) { this.address = address; } public String getAddress() { return address; } public void sendMail() { System.out.println("send mail to: " + address); } } 实际上,我们只是将使用者的Email信息抽取出来,并独立为一个辅助对象,这是为了在应用程序中操作方便而设计的,而实际上在数据库表格中的信息并没有增加,我们不用改变数据表的内容。 显然的,如果这么设计,对象与数据表并不是一个对映一个,对象的数量将会比数据表来的多,对象的设计粒度比数据表来的细,为了完成对象与数据表的对应,在Hibernate中使用<component>标签来进行设定,我们的User.hbm.xml映射文件撰写如下: User.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate./hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="onlyfun.caterpillar.User" table="USER"> <id name="id" type="string" unsaved-value="null"> <column name="ID" sql-type="char(32)"/> <generator class="uuid.hex"/> </id> <property name="name" type="string" not-null="true"> <column name="NAME" length="16" not-null="true"/> </property> <property name="sex" type="char" column="SEX"/> <property name="age" type="int" column="AGE"/> <component name="email" class="onlyfun.caterpillar.Email"> <property name="address" type="string" column="ADDRESS" not-null="true"/> </component> </class> </hibernate-mapping> 这个映射文件与之前的映射文件撰写相比,主要是多了红色的<component>部份,将Email类别当作User类别的一个组件(Component)。 接下来对对象的操作并没有什么太大的差别,例如下面的程序片段示范如何储存数据: User user = new User(); user.setName("caterpillar"); user.setSex(‘M‘); user.setAge(28); Email email = new Email(); email.setAddress("justin@caterpillar.onlyfun.net"); user.setEmail(email); Session session = sessionFactory.openSession(); Transaction tx= session.beginTransaction(); session.save(user); tx.commit(); session.close(); 下面的程序片段则示范如何查询数据: Session session = sessionFactory.openSession(); List users = session.find("from User"); session.close(); for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) { User user = (User) iterator.next(); System.out.println(user.getName() + "\n\tAge: " + user.getAge() + "\n\tSex: " + user.getSex()); user.getEmail().sendMail(); } 关于Component进一步的设定说明,可以看看参考手册的5.1.12内容。 |
|
来自: WindySky > 《Hibernate入门》