<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