Hibernate组件映射
Hibernate联合主键映射以及组件映射
在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学生表,课程表,选课表)。第二种情况就是很常见的情况,即只有一张表,表的主键是由本身的两个字段或以上构成的。比如:公司的财务统计表,其中有字段年份、月份、销售金额。在这张表中年份和月份才唯一确定一条记录。下面就来说说联合主键第二种情况的配置,就以上面的财务统计表来说明。对于联合主键的这种情况,我们经常把表中的主键字段提取出来单独作为一个类,其他字段则作为另一个类。对于财务统计表来说,我们则把年份和月份作为一个类SalDate,在另一个类则包含引用这个类和其他的字段。
假设我们有两个类,SalDate类表示联合主键(year、month),Total类(private int salTotal;private SalDate sd;)建完这两个类之后我们开始写Total.hbm.xml的配置文件:
<hibernate-mapping package="com.fendou.hibernate"> <class name="Total" table="t_salTotal"> <composite-id name="sd"> <key-property name="year"/> <key-property name="month"/> </composite-id> <property name="salTotal" length="50" column="sTotal"/> </class> </hibernate-mapping>
运行下,出现下面结果:
create table t_salTotal (year integer not null, month integer not null, sTotal integer, primary key (year, month))
没有问题。下面我们插入几条数据测试下:
session = HibernateUtils.getSession(); //开启事务 tr = session.beginTransaction(); SalDate d1 = new SalDate(); d1.setMonth(12); d1.setYear(2010); SalDate d2 = new SalDate(); d2.setMonth(12); d2.setYear(2010); Total t1 = new Total(); t1.setSalTotal(10000); t1.setSd(d1); Total t2 = new Total(); t2.setSalTotal(30000); t2.setSd(d2); session.save(t1); session.save(t2); tr.commit();
运行下:结果报错了:20:55:57,078 WARN RootClass:215 - composite-id class does not override hashCode(): com.fendou.hibernate.SalDate
组件映射:组件映射相对比较简单,所谓的组件就是一个被包含的对象。比如我们可以将通讯方式设置为一个组件,这个组件里面包含(QQ,MSN,Email,住址),而其他的对象皆可以使用这个组件,比如Teacher对象、Student对象。
组件对象代码如下:
package com.fendou.hibernate; public class Component { private String name; private String tel; private String address; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
使用组件的Teacher对象如下:
package com.fendou.hibernate; public class Teacher { private int id; private int sal; public Component getComp() { return comp; } public void setComp(Component comp) { this.comp = comp; } private Component comp; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getSal() { return sal; } public void setSal(int sal) { this.sal = sal; } }
配置文件如下:
<hibernate-mapping package="com.fendou.hibernate"> <class name="Teacher" table="t_teacher"> <id name="id" column="tid" length="2"> <generator class="native"></generator> </id> <property name="sal" /> <component name="comp"> <property name="name"/> <property name="tel"/> <property name="email"/> <property name="address"/> </component> </class> </hibernate-mapping>