首页 »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>
相关文章
读者评论
发表评论
|
|