域对象中,类之间存在四种关系,1关联,也就是类之间的引用关系,一对一,一对多,多对多,单向,双向。2 依赖,指的是类之间的访问关系,3 聚集,整体与部分的关系,部分类对象不能独立存在,4一般化,也就是继承关系
create table customer(id int auto_increment primary key,name varchar(20),homeprovince varchar(20),homeadrcity varchar(20), comprovince varchar(20),comadrcity varchar(20));建立关系数据模型的一个重要原则就是在不导致数据冗余的前提下,尽可能减少数据库表的数目以及他们之间的外键关联, 所以上面的sql语句并没有分成两张表来写,而是仅仅用了一张表。这样就避免了另外一张address表,并且查询的时候也不用外键关联了,但是如果还有一个employee也有address这样的情况下就需要去考虑把address给独立出来,要不就造成很大的数据冗余。但是域模型和数据模型是不通的出发点,域模型是有程序代码来组成,所以细化持久化类的粒度可以提高代码的可重用性,
所以在我们的域模型中,新建立了一个类address类,如下
package entity;
public class Address
{
private String province;
private String adrcity;
private Customer customer;
public void setProvince(String province)
{
this.province=province;
}
public String getProvince()
{
return this.province;
}
public void setAdrcity(String adrcity)
{
this.adrcity=adrcity;
}
public String getAdrcity()
{
return this.adrcity;
}
public void setCustomer(Customer customer)
{
this.customer=customer;
}
public Customer getCustomer()
{
return this.customer;
}
}其中address里面包括属性customer,customer里面增加两个属性分别为homeaddress和comaddress,这两个属性多时address类型,这样就相当于给customer类加了两个属性,而这两个属性分别代表两个组件,hibernate hbmxml里面配置如下
<component name="homeaddress" class="Address">
<parent name="customer"/>
<property name="province" column="HOMEPROVINCE"/>
<property name="adrcity" column="HOMEADRCITY" />
</component>
<component name="comaddress" class="Address">
<parent name="customer"/>
<property name="province" column="COMPROVINCE"/>
<property name="adrcity" column="COMADRCITY" />
</component>
component name为映射持久化类的属性名,class是指定homeaddress的类型, component还包括一个parent和一组property,其中parent是指出address所属的整体类,property则是具体的属性,通过上面的配置就可以对customer进行相应的数据库操作
public static void saveCustomerWithAdr()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer c=new Customer();
c.setName("andy.cao");
Address homeaddress=new Address();
homeaddress.setProvince("jiangsu");
homeaddress.setAdrcity("suzhou");
Address comaddress=new Address();
comaddress.setProvince("jiangsu");
comaddress.setAdrcity("suzhou");
c.setHomeaddress(homeaddress);
c.setComaddress(comaddress);
session.save(c);
session.getTransaction().commit();
}
上面这段就是业务逻辑,通过定义customer对象,给customer属性赋上相应的值,并对他保存,有上面可以看出address不具有oid,这是hibernate组件的一个重要特性,因为address没有oid,所以session不能单独保存更新删除,值类型,和实体类型最大的区别是前者不具有oid,不能单独持久化,虽然entity包里面多了address类,但是这个类可以说是customer类的辅助类,所以无需进行配置,如果配置了会给出异常