`
anxin587
  • 浏览: 23420 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

所以在我们的域模型中,新建立了一个类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类的辅助类,所以无需进行配置,如果配置了会给出异常

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics