第七章Hibernate 组件(component)映射
第七章 Hibernate组件(component)映射
- 组件(Component)映射的单向关联
- 组件映射的双向关联
- 组件集合映射
* 组件(Component)
- 除了粗粒度的对象模型设计(一个表映射成一个持久化类)之外,还可以采用细粒度的 对象模型,把一个表映射成两个或者多个类。
- 被细化出来的类,可以成为组件(Component)
User类:
public class User implements java.io.Serializable { private Integer id; private String username; private String password; private Profile profile; public User(){} public Profile getProfile() { return profile; } public void setProfile(Profile profile) { this.profile = profile; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }
Profile类:
public class Profile { private String email; private String address; private String postcode; private String mobile; private String phone; //加上该属性,修改配置文件,即双向关联 private User user; public Profile(){} public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPostcode() { return postcode; } public void setPostcode(String postcode) { this.postcode = postcode; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
Hibernate配置文件:
<hibernate-mapping> <class name="com.crazy.User" table="USERS2" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <property name="username" type="java.lang.String"> <column name="USERNAME" length="20" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="20" /> </property> <component name="profile" class="com.crazy.Profile"> <parent name="user"/> <property name="email" type="java.lang.String"> <column name="EMAIL" length="200" /> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS" length="200" /> </property> <property name="postcode" type="java.lang.String"> <column name="POSTCODE" length="10" /> </property> <property name="mobile" type="java.lang.String"> <column name="MOBILE" length="11" /> </property> <property name="phone" type="java.lang.String"> <column name="PHONE" length="20" /> </property> </component> </class> </hibernate-mapping>
双向关联配置:
<parent name="user"/>
- 组件集合映射
使用组件集合映射,可以让组件对象的集合依附于一个持久化对象。
Product 类:
public class Product implements java.io.Serializable { private Integer id; private String name; private Double price; private String description; private Date createTime; private Set images = new HashSet(); public Product() { } public Product(String name, Double price, String description, Date createTime, Set images) { this.name = name; this.price = price; this.description = description; this.createTime = createTime; this.images = images; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Double getPrice() { return this.price; } public void setPrice(Double price) { this.price = price; } public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } public Date getCreateTime() { return this.createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Set getImages() { return this.images; } public void setImages(Set images) { this.images = images; } }
Image 类:
public class Image { private String fileName; private String path; private Integer imageSize; public Image(){} public Image(String fileName,String path, Integer imageSize){ this.fileName = fileName; this.path = path; this.imageSize = imageSize; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public Integer getImageSize() { return imageSize; } public void setImageSize(Integer imageSize) { this.imageSize = imageSize; } }
映射配置文件:
<?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.crazy.Product" table="PRODUCT" schema="SCOTT"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" length="200" /> </property> <property name="price" type="java.lang.Double"> <column name="PRICE" precision="6" /> </property> <property name="description" type="java.lang.String"> <column name="DESCRIPTION" length="2000" /> </property> <property name="createTime" type="java.util.Date"> <column name="CREATE_TIME" length="7" /> </property> <set name="images" table="image"> <key column="PRODUCT_ID" foreign-key="id" /> <composite-element class="com.crazy.Image"> <property name="fileName" column="filename"></property> <property name="path" column="path"></property> <property name="imageSize" column="image_Size"></property> </composite-element> </set> </class> </hibernate-mapping>
与Set映射比较相似,在第六章仅仅映射了一个字段,这里映射了一个组件。
<set name="images" table="image"> <key column="PRODUCT_ID" foreign-key="id" /> <composite-element class="com.crazy.Image"> <property name="fileName" column="filename"></property> <property name="path" column="path"></property> <property name="imageSize" column="image_Size"></property> </composite-element> </set>
测试类:
public class HibernateTest { public static void main(String[] args) { HibernateTest test = new HibernateTest(); Product p = new Product(); p.setName("洗面奶"); p.setCreateTime(new Date()); p.setDescription("洗脸很干净!"); p.setPrice(999.99); Set<Image> images = new HashSet(); images.add(new Image("filename1","filePath1",1000)); images.add(new Image("filename2","filePath2",2000)); images.add(new Image("filename3","filePath3",3000)); p.setImages(images); test.addProduct(p); } public void addProduct(Product p){ Session session = new Configuration().configure().buildSessionFactory().openSession(); session.beginTransaction(); session.save(p); session.getTransaction().commit(); } public void printProduct(Product p){ System.out.println("商品编号:" + p.getId()); System.out.println("商品价格:" + p.getPrice()); System.out.println("商品名称:" + p.getName()); Set<Image> images = p.getImages(); for(Image image:images){ System.out.println("image名称:" + image.getFileName()); System.out.println("image路径:" + image.getPath()); System.out.println("image大小:" + image.getImageSize()); } } }