hibernate中 多对一

来源:互联网 发布:淘宝客服旺旺操作 编辑:程序博客网 时间:2024/04/30 19:53
多对一的hbm。xml文件customer<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="cn.itcast.hibernate.many2double.Order" table="orders"><id name="id" type="integer"><column name="id"></column><generator class="increment"></generator></id><property name="orderNumber" type="string"><column name="orderNumber"></column></property><property name="price" type="double"><column name="price"></column></property><!-- many-to-one:表示配置多对一的关系,这里是多个订单对应一个客户name:待映射的持久化类中的属性column:表示customer属性对应表的外键 这里是custoemr_id容易的理解方式:如何获取订单属于的客户 这里是通过订单表的外键来查寻客户的信息cascade="save-update"级联保存和级联更新当保存订单是 此时订单对象进入sesison的一级缓存 通过cascade="save-update" 这是也让与orders对像关联的custoemr对象也进入到session的一级缓存 --><many-to-one name="customer" class="cn.itcast.hibernate.many2double.Customer" cascade="save-update"><column name="customer_id"></column></many-to-one></class></hibernate-mapping>orders
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    <hibernate-mapping>    <class name="cn.itcast.hibernate.many2double.Customer" table="customer">    <id name="id" type="integer">    <column name="id"></column>    <generator class="increment"></generator>    </id>    <property name="name" type="string">    <column name="name"></column>    </property>    <!--     set:用户用于配置集合 1对多    name:待映射的持久化类中的属性    table:表示给集合中的信息来源于orders表      这里的集合存放的是订单 来源于orders表    key:中配置的一般都是外键    one-to-many class 映射一对多的关系 class表示orders集合中放置的是clas属性    指定的类型对象    cascade="save-update"级联保存级联更新      当保存客户时 客户进入session的一级缓存(持久对象)关联的订单集合      也进入session的一级缓存 持久化     -->    <set name="orders" table="orders" cascade="save-update">    <key>    <column name="customer_id"></column>    </key>    <one-to-many class="cn.itcast.hibernate.many2double.Order" />    </set>    </class>    </hibernate-mapping>

测试APP

private static SessionFactory sf;static{Configuration config=new Configuration();config.configure("cn/itcast/hibernate/many2double/hibernate.cfg.xml");config.addClass(Customer.class);config.addClass(Order.class);sf=config.buildSessionFactory();}/* * 先保存订单时  客户的id不知道 所以为空  客户添加好后在更新订单表 * *///先保存订单在保存客户@Testpublic void saveOrderAndCustomer(){Session s=sf.openSession();Transaction ts=s.beginTransaction();Customer c=new Customer();c.setName("刘赵强111");Order o=new Order();o.setPrice(213d);o.setOrderNumber("No0011");//建立订单与客户的关联//o.setCustomer(c);//建立客户与订单的关联c.getOrders().add(o);//保存订单s.save(o);//保存客户s.save(c);ts.commit();s.close();}//保存客户不保存订单@Testpublic void saveCustomer(){Session s=sf.openSession();Transaction ts=s.beginTransaction();//临时对象 没哟oid oid=nullCustomer c=new Customer();c.setName("刘赵强111");//临时对象 没有oid oid=nullOrder o=new Order();o.setPrice(213d);o.setOrderNumber("No0011");//建立订单与客户的关联o.setCustomer(c);//建立客户与订单的关联c.getOrders().add(o);//保存客户 放置客户到session的一级缓存中这时 要分配给客户一个oid //转化为一个持久对象  客户所关联的订单集合是一个临时对象//保存客户s.save(c);//保存订单//s.save(o);ts.commit();s.close();}//查询客户订单@Testpublic void findCustomer(){Session s=sf.openSession();Transaction ts=s.beginTransaction();Customer c=(Customer)s.get(Customer.class,1);System.out.println(c.getId()+".."+c.getName());Set<Order> orders=c.getOrders();for(Order o:orders){System.out.println(o.getOrderNumber()+"..."+o.getPrice());}ts.commit();s.close();}//对象导航@Testpublic void testObjectRelation(){Session s=sf.openSession();Transaction ts=s.beginTransaction();Order o1=new Order();o1.setOrderNumber("001");o1.setPrice(10);Order o2=new Order();o2.setOrderNumber("002");o2.setPrice(10);Order o3=new Order();o3.setOrderNumber("003");o3.setPrice(30);Customer c=new Customer();c.setName("刘赵强");o1.setCustomer(c);c.getOrders().add(o2);c.getOrders().add(o3);//s.save(o1);4条记录//s.save(c);3条记录s.save(o2);//1条记录ts.commit();s.close();}


原创粉丝点击