`

[转]hibernate初级 对象-映射组成关系

阅读更多

域对象中,类之间存在四种关系,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给独立出来,要不就造成很大的数据冗余。但是域模型和数据模型是不通的出发点,域模型是有程序代码来组成,所以细化持久化类的粒度可以提高代码的可重用性

java 代码
  1.   
  2.   
  3. package entity;   
  4. public class Address   
  5. {   
  6.  private String province;   
  7.  private String adrcity;   
  8.  private Customer customer;   
  9.   
  10.  public void setProvince(String province)   
  11.  {   
  12.   this.province=province;   
  13.  }   
  14.  public String getProvince()   
  15.  {   
  16.   return this.province;   
  17.  }   
  18.     
  19.  public void setAdrcity(String adrcity)   
  20.  {   
  21.   this.adrcity=adrcity;   
  22.  }   
  23.  public String getAdrcity()   
  24.  {   
  25.   return this.adrcity;   
  26.  }   
  27.   
  28.  public void setCustomer(Customer customer)   
  29.  {   
  30.   this.customer=customer;   
  31.  }   
  32.  public Customer getCustomer()   
  33.  {   
  34.   return this.customer;   
  35.  }   
  36.   

所以在我们的域模型中,新建立了一个类address类,如下}其中address里面包括属性customer,customer里面增加两个属性分别为homeaddress和comaddress,这两个属性多时address类型,这样就相当于给customer类加了两个属性,而这两个属性分别代表两个组件,hibernate hbmxml里面配置如下

<component class="Address" name="homeaddress">
  <parent name="customer"></parent> </component><component class="Address" name="comaddress">
<parent name="customer"></parent> </component>component name为映射持久化类的属性名,class是指定homeaddress的类型, component还包括一个parent和一组property,其中parent是指出address所属的整体类,property则是具体的属性,通过上面的配置就可以对customer进行相应的数据库操作

java 代码
  1. public static void saveCustomerWithAdr()   
  2.  {   
  3.   Session session=HibernateUtil.getSessionFactory().openSession();   
  4.   session.beginTransaction();   
  5.   Customer c=new Customer();   
  6.   c.setName("andy.cao");   
  7.   Address homeaddress=new Address();   
  8.   homeaddress.setProvince("jiangsu");   
  9.   homeaddress.setAdrcity("suzhou");   
  10.   Address comaddress=new Address();   
  11.   comaddress.setProvince("jiangsu");   
  12.   comaddress.setAdrcity("suzhou");   
  13.   c.setHomeaddress(homeaddress);   
  14.   c.setComaddress(comaddress);   
  15.   session.save(c);   
  16.   session.getTransaction().commit();   
  17.  }   
  18.   

上面这段就是业务逻辑,通过定义customer对象,给customer属性赋上相应的值,并对他保存,有上面可以看出address不具有oid,这是hibernate组件的一个重要特性,因为address没有oid,所以session不能单独保存更新删除,值类型,和实体类型最大的区别是前者不具有oid,不能单独持久化,虽然entity包里面多了address类,但是这个类可以说是customer类的辅助类,所以无需进行配置,如果配置了会给出异常

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics