<hibernate-mapping package="cn.jbit.entity"> <class entity-name="ItemEntity" table="TBL_ITEM_ENTITY"> <id name="id" column="ITEM_ID" type="long"> <generator class="sequence"> <param name="sequence">SEQ_ITEM_ENTITY_ID</param> </generator> </id> <property name="initialPrice" type="big_decimal" column="INIT_PRICE" /> <property name="description" type="string" column="DESCRIPTION" /> <many-to-one name="seller" entity-name="UserEntity" column="USER_ID" /> </class> <class entity-name="UserEntity" table="TBL_USER_ENTITY"> <id name="id" column="USER_ID" type="long"> <generator class="sequence"> <param name="sequence">SEQ_USER_ENTITY_ID</param> </generator> </id> <property name="username" type="string" column="UNAME" /> <bag name="itemsForSale" inverse="true" cascade="all"> <key column="USER_ID" /> <one-to-many entity-name="ItemEntity" /> </bag> </class> </hibernate-mapping>在这个映射文件中有三个值得关注的东西要看。
Map user = new HashMap(); user.put("username", "张三"); Map item1 = new HashMap(); item1.put("initialPrice", new BigDecimal(90)); item1.put("description", "商品描述信息1"); item1.put("seller", user); Map item2 = new HashMap(); item2.put("initialPrice", new BigDecimal(200)); item1.put("description", "商品描述信息2"); item2.put("seller", user); Collection itemsForSale = new ArrayList(); itemsForSale.add(item1); itemsForSale.add(item2); user.put("itemsForSale", itemsForSale); session.save("UserEntity", user);// 保存常见问题:可以在动态模式中映射一个Set(集)吗?基于set的集合不适用于动态的实体模式,在前一个代码示例中,想象itemsForSale是一个Set。Set在它的元素中检查重复元素,因此当你调用add(item1)和add(item2)时,这些对象的equals()方法也被调用。然而,item1和item2是JavaMap实例,一个映射的equals()实现基于映射的键组。因此,由于item1和item2是带有相同键的映射,因此当它们被添加给一个Set时,并没有明显的区别。只有当你在动态的实体模式中需要集合时才使用bag或者list。
Long storedItemId = 2L; Session session = HibernateUtil.getSession(); session.beginTransaction(); ItemPojo itemPojo = (ItemPojo) session.get("ItemEntity",storedItemId); itemPojo.setInitialPrice(new BigDecimal(1000)); session.getTransaction().commit(); session.close();也可以在HQL查询中引用实体名称:
List quriedItemMaps = session.createQuery("from ItemEntity where initialPrice >= :price") .setParameter("price", new BigDecimal(2)).list();这个查询返回ItemEntity映射的集合。它们处于持久化状态。
<hibernate-mapping package="cn.jbit.entity"> <class name="ItemPojo" entity-name="ItemEntity" table="TBL_ITEM_ENTITY"> <id name="id" column="ITEM_ID" type="long"> <generator class="sequence"> <param name="sequence">SEQ_ITEM_ENTITY_ID</param> </generator> </id> <property name="initialPrice" type="big_decimal" column="INIT_PRICE" /> <property name="description" type="string" column="DESCRIPTION" /> <many-to-one name="seller" class="UserPojo" entity-name="UserEntity" column="USER_ID" /> </class> <class name="UserPojo" entity-name="UserEntity" table="TBL_USER_ENTITY"> <id name="id" column="USER_ID" type="long"> <generator class="sequence"> <param name="sequence">SEQ_USER_ENTITY_ID</param> </generator> </id> <property name="username" type="string" column="UNAME" /> <bag name="itemsForSale" inverse="true" cascade="all"> <key column="USER_ID" /> <one-to-many entity-name="ItemEntity" class="ItemPojo" /> </bag> </class> </hibernate-mapping>显然,你还需要两个类ItemPojo和UserPojo,它们实现了这些实体的属性。
UserPojo user = new UserPojo(); ... ItemPojo item1 = new ItemPojo(); ... ItemPojo item2 = new ItemPojo(); ... Collection itemsForSale = new ArrayList(); ... session.save(user);当使用一个混合的表示法映射时,你要告诉Hibernate逻辑名称:
... session.save("UserEntity",user);可以全局地或者临时地切换到一个动态的映射表示法,但是实体模式的全局转换会带来严重的后果。要全局地转换,得把下列代码添加到Hibernate配置中;例如,在hibernate.cfg.xml中:
<property name="default_entity_mode">dynamic-map</property>你更有可能想要临时切换到另一种实体模式,因此假设你把SessionFactory置于默认的POJO模式中。要在一个特定的Session中切换到动态映射,可以在现有会话的上面打开新的临时Sesion。下列代码使用了这样的一个临时的Session来为一位现有的卖家保存一件新的拍卖货品:
Session dynamicSession = session.getSession(EntityMode.MAP); tx = dynamicSession.beginTransaction(); tx.begin(); Map seller = (Map) dynamicSession.get("UserEntity", userId); Map newItemMap = new HashMap(); newItemMap.put("description", "商品3描述"); newItemMap.put("initialPrice", new BigDecimal(1000)); newItemMap.put("seller", seller); dynamicSession.save("ItemEntity", newItemMap);用getSession()打开的临时dynamicSession不需要被清除或关闭;它继承原始Session的上下文。
<hibernate-mapping package="cn.jbit.entity"> <class name="Item" entity-name="ItemAuctionEntity" table="TBL_ITEM_AUCTION"> <id name="id" column="ITEM_AUCTION_ID"> <generator class="native" /> </id> <property name="description" column="DESCRIPTION" /> <property name="initialPrice" column="INIT_PRICE" /> </class> <class name="Item" entity-name="ItemSaleEntity" table="TBL_ITEM_SALE"> <id name="id" column="ITEM_SALE_ID"> <generator class="native" /> </id> <property name="description" column="DESCRIPTION" /> <property name="salesPrice" column="SALESS_PRICE" /> </class> </hibernate-mapping> Item itemForAuction = new Item(); itemForAuction.setDescription("An item for auction"); itemForAuction.setInitialPrice(new BigDecimal(99)); session.save("ItemAuctionEntity",itemForAuction); Item itemForSale = new Item(); itemForSale.setDescription("An item for sale"); itemForSale.setSalesPrice(new BigDecimal(99)); session.save("ItemSaleEntity",itemForSale);由于逻辑实体名称,Hibernate知道它应该把数据插入到哪张表中。根据用于加载和查询实体的实体名称,Hibernate从适当的表中选择。
Hibernate实战_笔记21(创建动态的应用程序),布布扣,bubuko.com
原文:http://blog.csdn.net/com185272358/article/details/21242845