Hibernate建议在进行领域模型建模时要细粒度一些,简单地说,就是类要比表多,这种映射方式就是组件(component)映射。
组件类是值类型的,即它没有对象标识符属性,在数据库中也没有对应的表,它只隶属于另一个持久化类的实例。它的数据被嵌入到所隶属的持久化实例对应的数据库表的记录中。
组件映射的应用有三种常见情况:把组件类作为持久化类的单个属性来使用、把组件类作为持久化类的集合属性来使用、把组件类作为持久化类的对象标识符来使用。下面分别来介绍。
1、组件类作为持久化类的单个属性
定义一个Address类(它是值类型的),代码如下:
Address.java
- package com.zxf.domain;
- /**
- * 地址类
- * 值类型,它没有对象标识符属性。
- * 只能隶属于一个持久化类的实例,它的数据也是被嵌入到所隶属的持久化实例对应的数据库表的记录的。
- */
- public class Address {
- private String province; //省份名
- private String city; //城市
- private String detail; //地址详情,如街道,小区,门牌号等
- private String zipcode; //邮编
- private String telephone; //固定电话
- private String mobilephone; //移动电话
- public Address(){} //无参数的构造方法
- //以下省略所有属性的getters和setters方法...
- }
package com.zxf.domain; /** * 地址类 * 值类型,它没有对象标识符属性。 * 只能隶属于一个持久化类的实例,它的数据也是被嵌入到所隶属的持久化实例对应的数据库表的记录的。 */ public class Address { private String province; //省份名 private String city; //城市 private String detail; //地址详情,如街道,小区,门牌号等 private String zipcode; //邮编 private String telephone; //固定电话 private String mobilephone; //移动电话 public Address(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Customer.java
- package com.zxf.domain;
- /** 客户持久化类(实体类) */
- public class Customer {
- private Long id; //对象标识符(OID)
- private String loginname; //登录名
- private String password; //密码
- private String email; //邮箱号
- private Address homeAddress; //联系地址
- private Address deliverAddress; //送货地址
- public Customer(){} //无参数的构造方法
- //以下省略所有属性的getters和setters方法...
- }
package com.zxf.domain; /** 客户持久化类(实体类) */ public class Customer { private Long id; //对象标识符(OID) private String loginname; //登录名 private String password; //密码 private String email; //邮箱号 private Address homeAddress; //联系地址 private Address deliverAddress; //送货地址 public Customer(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Customer.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.zxf.domain.Customer" table="customer">
- <id name="id" column="id" type="long">
- <generator class="native" />
- </id>
- <property name="loginname" not-null="true"/>
- <property name="password" not-null="true"/>
- <property name="email"/>
- <!-- 用component元素映射组件类属性homeAddress -->
- <component name="homeAddress" class="com.zxf.domain.Address">
- <!-- 用property映射组件类的每个属性 -->
- <property name="province" column="home_province"/>
- <property name="city" column="home_city"/>
- <property name="detail" column="home_detail"/>
- <property name="zipcode" column="home_zipcode"/>
- <property name="telephone" column="home_telephone"/>
- <property name="mobilephone" column="home_mobilephone"/>
- </component>
- <!-- 用component元素映射组件类属性deliverAddress -->
- <component name="deliverAddress" class="com.zxf.domain.Address">
- <property name="province" column="deliver_province"/>
- <property name="city" column="deliver_city"/>
- <property name="detail" column="deliver_detail"/>
- <property name="zipcode" column="deliver_zipcode"/>
- <property name="telephone" column="deliver_telephone"/>
- <property name="mobilephone" column="deliver_mobilephone"/>
- </component>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.zxf.domain.Customer" table="customer"> <id name="id" column="id" type="long"> <generator class="native" /> </id> <property name="loginname" not-null="true"/> <property name="password" not-null="true"/> <property name="email"/> <!-- 用component元素映射组件类属性homeAddress --> <component name="homeAddress" class="com.zxf.domain.Address"> <!-- 用property映射组件类的每个属性 --> <property name="province" column="home_province"/> <property name="city" column="home_city"/> <property name="detail" column="home_detail"/> <property name="zipcode" column="home_zipcode"/> <property name="telephone" column="home_telephone"/> <property name="mobilephone" column="home_mobilephone"/> </component> <!-- 用component元素映射组件类属性deliverAddress --> <component name="deliverAddress" class="com.zxf.domain.Address"> <property name="province" column="deliver_province"/> <property name="city" column="deliver_city"/> <property name="detail" column="deliver_detail"/> <property name="zipcode" column="deliver_zipcode"/> <property name="telephone" column="deliver_telephone"/> <property name="mobilephone" column="deliver_mobilephone"/> </component> </class> </hibernate-mapping>
配置文件:hibernate.cfg.xml
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 数据库方言设置 -->
- <property name="hibernate.dialect">
- org.hibernate.dialect.MySQLInnoDBDialect
- </property>
- <!-- 数据库连接参数设置 -->
- <property name="hibernate.connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">123</property>
- <!--实际操作数据库时是否显示SQL -->
- <!--
- <property name="hibernate.show_sql">true</property>-->
- <property name="hibernate.format_sql">true</property>
- <!--将数据库schema的DDL导出到数据库 -->
- <property name="hibernate.hbm2ddl.auto">update</property>
- <!-- 以下定义实体类与数据库表的映像文件 -->
- <mapping resource="com/zxf/domain/Customer.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库方言设置 --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLInnoDBDialect </property> <!-- 数据库连接参数设置 --> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!--实际操作数据库时是否显示SQL --> <!-- <property name="hibernate.show_sql">true</property>--> <property name="hibernate.format_sql">true</property> <!--将数据库schema的DDL导出到数据库 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 以下定义实体类与数据库表的映像文件 --> <mapping resource="com/zxf/domain/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>
2、组件类作为持久化类的集合属性
Photo.java
- package com.zxf.domain;
- /** 照片类--值类型 */
- public class Photo {
- private String name; //照片名
- private String filePath; //照片存放路径
- private String description; //描述
- private int width; //原始宽度
- private int height; //原始高度
- public Photo(){} //无参数的构造方法
- //以下省略所有属性的getters和setters方法...
- }
package com.zxf.domain; /** 照片类--值类型 */ public class Photo { private String name; //照片名 private String filePath; //照片存放路径 private String description; //描述 private int width; //原始宽度 private int height; //原始高度 public Photo(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Album.java
- package com.zxf.domain;
- import java.util.Date;
- import java.util.List;
- /** 相册持久化类(实体类) */
- public class Album {
- private Long id; //对象标识符(OID)
- private String title; //相册名
- private String description; //描述
- private Date creationTime; //建立时间
- private List<Photo> photos; //照片集
- public Album(){} //无参数的构造方法
- //以下省略所有属性的getters和setters方法...
- }
package com.zxf.domain; import java.util.Date; import java.util.List; /** 相册持久化类(实体类) */ public class Album { private Long id; //对象标识符(OID) private String title; //相册名 private String description; //描述 private Date creationTime; //建立时间 private List<Photo> photos; //照片集 public Album(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Album.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <!-- 映射持久化类 -->
- <class name="com.zxf.domain.Album" table="album">
- <!-- 映射对象标识符 -->
- <id name="id" column="id" type="long">
- <!-- 指定对象标识符生成器 -->
- <generator class="native" />
- </id>
- <!-- 用property映射每个普通属性 -->
- <property name="title"/>
- <property name="description"/>
- <property name="creationTime" column="creation_time"/>
- <!-- 用bag来映射List集合属性 -->
- <bag name="photos" table="photo">
- <!-- key元素:指定集合属性对应的表的外键列 -->
- <key column="album_id" not-null="true" />
- <!-- composite-element元素:映射集合里的元素
- class属性:指定集合里的元素的类类型
- -->
- <composite-element class="com.zxf.domain.Photo">
- <!-- 用property映射每个普通属性 -->
- <property name="name" />
- <property name="filePath" column="file_path" />
- <property name="description" />
- <property name="width" />
- <property name="height" />
- </composite-element>
- </bag>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 映射持久化类 --> <class name="com.zxf.domain.Album" table="album"> <!-- 映射对象标识符 --> <id name="id" column="id" type="long"> <!-- 指定对象标识符生成器 --> <generator class="native" /> </id> <!-- 用property映射每个普通属性 --> <property name="title"/> <property name="description"/> <property name="creationTime" column="creation_time"/> <!-- 用bag来映射List集合属性 --> <bag name="photos" table="photo"> <!-- key元素:指定集合属性对应的表的外键列 --> <key column="album_id" not-null="true" /> <!-- composite-element元素:映射集合里的元素 class属性:指定集合里的元素的类类型 --> <composite-element class="com.zxf.domain.Photo"> <!-- 用property映射每个普通属性 --> <property name="name" /> <property name="filePath" column="file_path" /> <property name="description" /> <property name="width" /> <property name="height" /> </composite-element> </bag> </class> </hibernate-mapping>
配置文件:hibernate.cfg.xml
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 数据库方言设置 -->
- <property name="hibernate.dialect">
- org.hibernate.dialect.MySQLInnoDBDialect
- </property>
- <!-- 数据库连接参数设置 -->
- <property name="hibernate.connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">123</property>
- <!--实际操作数据库时是否显示SQL -->
- <!--
- <property name="hibernate.show_sql">true</property>-->
- <property name="hibernate.format_sql">true</property>
- <!--将数据库schema的DDL导出到数据库 -->
- <property name</
评论