专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » hibernate映射:hibernate3学习笔记(十 6)|容器映射 »正文

hibernate映射:hibernate3学习笔记(十 6)|容器映射

来源: 发布时间:星期四, 2009年1月15日 浏览:48次 评论:0
  1.Set映射

  DDL:

CREATETABLEuser(
  idINT(11)NOTNULLauto_incrementPRIMARYKEY,
  nameVARCHAR(100)NOTNULLdefault''
);
CREATETABLEemail(
  idINT(11)NOTNULL,
  addressVARCHAR(100)NOTNULL
);


  User.java

packagecom.hb3.pack_11.model;
importjava.util.Set;
publicUser{
  privateIntegerid;
  privateStringname;
  privateSet<String>emails; 
  publicUser{
  }
  publicIntegergetId{
    id;
  }
  publicvoidId(Integerid){
    this.id=id;
  }
  publicStringgetName{
    name;
  }
  publicvoidName(Stringname){
    this.name=name;
  }
  publicSet<String>getEmails{
    emails;
  }
  publicvoidEmails(Set<String>emails){
    this.emails=emails;
  }
  publicvoidaddEmail(Stringemail){
    this.emails.add(email);
  }
  publicvoidremoveEmail(Stringemail){
    this.emails.remove(email);
  }
}


  User.hbm.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping 
  PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <name="com.hb3.pack_11.model.User"table="user">
    <idname="id"column="id"type="java.lang.Integer">
      <generator="native"/>
    </id>
    <propertyname="name"column="name"type="java.lang.String"/>
    <name="emails"table="email">
      <keycolumn="id"/>
      <elementtype="java.lang.String"column="address"/>
    </>
  </>
</hibernate-mapping>


  测试代码:

packagecom.hb3.pack_11;
importjava.io.IOException;
importjava.sql.SQLException;
importjava.util.HashSet;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hb3.pack_11.model.User;
publicBusinessService{
  publicvoid(Stringargs)throwsIOException,SQLException{
    Configurationconfig=Configuration.configure;
    SessionFactorysessionFactory=config.buildSessionFactory;   
    Sessionsession=sessionFactory.openSession;
    Useruser1=User;
    user1.Emails(HashSet<String>);
    user1.Name("shenbin");
    user1.addEmail("[email protected]");
    user1.addEmail("[email protected]");
    Useruser2=User;
    user2.Emails(HashSet<String>);
    user2.Name("chenyan");
    user2.addEmail("[email protected]");
    Transactiontx=session.beginTransaction;      
    session.save(user1);
    session.save(user2); 
    tx.commit;
    session.close;
    sessionFactory.close;
  }
}


  Set特点就是不能放置相同物件在Set中

  也就是说上述例子中个User虽然可以对应多个emails但是emails却不能有相同(对同个人而言)

  2.List映射

  DDL:

CREATETABLEuser(
  idINT(11)NOTNULLauto_incrementPRIMARYKEY,
  nameVARCHAR(100)NOTNULLdefault''
);
CREATETABLEitem(
  idINT(11)NOTNULL,
  positionINT(11)NOTNULL,
  nameVARCHAR(100)NOTNULLdefault''
);


  User.java

packagecom.hb3.pack_12.model;
importjava.util.List;
publicUser{
  privateIntegerid;
  privateStringname;
  privateList<String>items; 
  publicUser{
  }
  publicIntegergetId{
    id;
  }
  publicvoidId(Integerid){
    this.id=id;
  }
  publicStringgetName{
    name;
  }
  publicvoidName(Stringname){
    this.name=name;
  }
  publicList<String>getItems{
    items;
  }
  publicvoidItems(List<String>items){
    this.items=items;
  }
  publicvoidaddItem(Stringitem){
    items.add(item);
  }
  publicvoidremoveItem(Stringitem){
    items.remove(item);
  }
}


  User.hbm.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping 
  PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> 
  <name="com.hb3.pack_12.model.User"table="user"> 
    <idname="id"column="id"type="java.lang.Integer"> 
      <generator="native"/> 
    </id> 
    <propertyname="name"column="name"type="java.lang.String"/> 
    <listname="items"table="item"> 
      <keycolumn="id"/> 
      <indexcolumn="position"/> 
      <elementtype="java.lang.String"column="name"/> 
    </list> 
  </> 
</hibernate-mapping>


  测试代码:

packagecom.hb3.pack_12;
importjava.io.IOException;
importjava.sql.SQLException;
importjava.util.ArrayList;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hb3.pack_12.model.User;
publicBusinessService{
  publicvoid(Stringargs)throwsIOException,SQLException{
    Configurationconfig=Configuration.configure;
    SessionFactorysessionFactory=config.buildSessionFactory;   
    Sessionsession=sessionFactory.openSession;
    Useruser1=User;
    user1.Items(ArrayList<String>);
    user1.Name("shenbin");
    user1.addItem("DC");
    user1.addItem("CFCard");
    Useruser2=User;
    user2.Items(ArrayList<String>);
    user2.Name("chenyan");
    user2.addItem("CD");
    Transactiontx=session.beginTransaction;      
    session.save(user1);
    session.save(user2); 
    tx.commit;
    session.close;
    sessionFactory.close;
  }
}


  List是有序结构他在存储物品时候还对物品所处位置进行了记录

  3.Bag映射

  DDL:

CREATETABLEuser(
  idINT(11)NOTNULLauto_incrementPRIMARYKEY,
  nameVARCHAR(100)NOTNULLdefault''
);
CREATETABLEitem(
  idINT(11)NOTNULL,
  nameVARCHAR(100)NOTNULL
);


  User.java

packagecom.hb3.pack_13.model;
importjava.util.List;
publicUser{
  privateIntegerid;
  privateStringname;
  privateList<String>items; 
  publicUser{
  }
  publicIntegergetId{
    id;
  }
  publicvoidId(Integerid){
    this.id=id;
  }
  publicStringgetName{
    name;
  }
  publicvoidName(Stringname){
    this.name=name;
  }
  publicList<String>getItems{
    items;
  }
  publicvoidItems(List<String>items){
    this.items=items;
  }
  publicvoidaddItem(Stringitem){
    items.add(item);
  }
  publicvoidremoveItem(Stringitem){
    items.remove(item);
  }
}


  User.hbm.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping 
  PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> 
  <name="com.hb3.pack_12.model.User"table="user"> 
    <idname="id"column="id"type="java.lang.Integer"> 
      <generator="native"/> 
    </id> 
    <propertyname="name"column="name"type="java.lang.String"/> 
    <bagname="items"table="item"> 
      <keycolumn="id"/> 
      <elementcolumn="name"type="java.lang.String"/> 
    </bag> 
  </> 
</hibernate-mapping>


  测试代码:

packagecom.hb3.pack_13;
importjava.io.IOException;
importjava.sql.SQLException;
importjava.util.ArrayList;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hb3.pack_12.model.User;
publicBusinessService{
  publicvoid(Stringargs)throwsIOException,SQLException{
    Configurationconfig=Configuration.configure;
    SessionFactorysessionFactory=config.buildSessionFactory;   
    Sessionsession=sessionFactory.openSession;
    Useruser1=User;
    user1.Items(ArrayList<String>);
    user1.Name("shenbin");
    user1.addItem("JavaGossip");
    user1.addItem("JavaGossip");
    user1.addItem("CaxxxA80");
    Useruser2=User;
    user2.Items(ArrayList<String>);
    user2.Name("chenyan");
    user2.addItem("Snoppyworld"); 
    Transactiontx=session.beginTransaction;
    session.save(user1);
    session.save(user2);
    tx.commit;
    session.close;
    sessionFactory.close;
  }
}


  Bag是Hibernate自己提供集合他和Set区别是它允许重复他和List区别是他不去管List容器中順序

  然而倘若要做下面更新处理:

  Sessionsession=sessionFactory.openSession;

  Transactiontx=session.beginTransaction;

  Useruser=(User)session.load(User.,Integer(1));

  user.removeItem("JavaGossip");

  tx.commit;

  session.close;

  运行SQL文为:

Hibernate: delete from item where id=?
Hibernate: insert o item (id, name) values (?, ?)
Hibernate: insert o item (id, name) values (?, ?)
  由于Bag集合允许重复当更新数据时他无法知道需要更改是重复数据中哪比数据所以采取全部删除后重新写入方式

  然后这显然是种没有效率做法

  幸运Hibernate提供idbag借由在定义Bag映射时加上"collection-id"让Hibernate能确定需要更改那条记录从而提高效率

  新建表格:

CREATETABLEuser(
  idINT(11)NOTNULLauto_incrementPRIMARYKEY,
  nameVARCHAR(100)NOTNULLdefault''
);
CREATETABLEitem(
  cidCHAR(32)NOTNULL,
  idINT(11)NOTNULL,
  nameVARCHAR(100)NOTNULL
);


  改写User.hbm.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping 
  PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> 
  <name="com.hb3.pack_12.model.User"table="user"> 
    <idname="id"column="id"type="java.lang.Integer"> 
      <generator="native"/> 
    </id> 
    <propertyname="name"column="name"type="java.lang.String"/> 
    <idbagname="items"table="item"> 
      <collection-idcolumn="cid"type="java.lang.String">
        <generator="uuid.hex"/>
      </collection-id>
      <keycolumn="id"/>      
      <elementcolumn="name"type="java.lang.String"/> 
    </idbag>
  </>
</hibernate-mapping>


  测试代码:

packagecom.hb3.pack_13;
importjava.io.IOException;
importjava.sql.SQLException;
importjava.util.ArrayList;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hb3.pack_12.model.User;
publicBusinessService{
  publicvoid(Stringargs)throwsIOException,SQLException{
    Configurationconfig=Configuration.configure;
    SessionFactorysessionFactory=config.buildSessionFactory;   
    Sessionsession=sessionFactory.openSession;
    Useruser1=User;
    user1.Items(ArrayList<String>);
    user1.Name("shenbin");
    user1.addItem("JavaGossip");
    user1.addItem("JavaGossip");
    user1.addItem("CaxxxA80");
    Useruser2=User;
    user2.Items(ArrayList<String>);
    user2.Name("chenyan");
    user2.addItem("Snoppyworld"); 
    Transactiontx=session.beginTransaction;
    session.save(user1);
    session.save(user2);
    tx.commit;
    session.close;
    session=sessionFactory.openSession;
    tx=session.beginTransaction;
    Useruser=(User)session.load(User.,Integer(1));
    user.removeItem("JavaGossip");
    tx.commit;
    session.close;
    sessionFactory.close;
  }
}


  SQL文Log:

13:32:16,187 WARN ConfigurationFactory:127 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the path: jar:file:/D:/Java/MyEclipse%206.0/workspace/hb3demo/ehcache-1.2.3.jar!/ehcache-failsafe.xml
13:32:16,609 WARN EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.
13:32:16,640 WARN EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
Hibernate: insert o user (name) values (?)
Hibernate: insert o user (name) values (?)
Hibernate: insert o item (id, cid, name) values (?, ?, ?)
Hibernate: insert o item (id, cid, name) values (?, ?, ?)
Hibernate: insert o item (id, cid, name) values (?, ?, ?)
Hibernate: insert o item (id, cid, name) values (?, ?, ?)
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_ from user user0_ where user0_.id=?
Hibernate: select items0_.id as id0_, items0_.name as name0_, items0_.cid as cid0_ from item items0_ where items0_.id=?
Hibernate: delete from item where cid=?


  4.Map映射

  DDL:

CREATETABLEuser(
  idINT(11)NOTNULLauto_incrementPRIMARYKEY,
  nameVARCHAR(100)NOTNULLdefault''
);
CREATETABLEitem(
  idINT(11)NOTNULL,
  nameVARCHAR(100)NOTNULL,
  pricedecimal(10,2)NOTNULL
);


  User.java

packagecom.hb3.pack_14.model;
importjava.math.BigDecimal;
importjava.util.Map;
publicUser{
  privateIntegerid;
  privateStringname;
  privateMap<String,BigDecimal>items; 
  publicUser{
  }
  publicIntegergetId{
    id;
  }
  publicvoidId(Integerid){
    this.id=id;
  }
  publicStringgetName{
    name;
  }
  publicvoidName(Stringname){
    this.name=name;
  }
  publicMap<String,BigDecimal>getItems{
    items;
  }
  publicvoidItems(Map<String,BigDecimal>items){
    this.items=items;
  }
  publicvoidaddItem(Stringkey,BigDecimalvalue){
    items.put(key,value);
  }
  publicvoidremoveItem(Stringkey){
    items.remove(key);
  }
}


  User.hbm.xml:

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping 
  PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> 
  <name="com.hb3.pack_14.model.User"table="user"> 
    <idname="id"column="id"type="java.lang.Integer"> 
      <generator="native"/> 
    </id> 
    <propertyname="name"column="name"type="java.lang.String"/> 
    <mapname="items"table="item">
      <keycolumn="id"/>
      <map-keycolumn="name"type="java.lang.String"/>
      <elementcolumn="price"type="java.math.BigDecimal"/>
    </map>
  </>
</hibernate-mapping>


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: