Hiberate之数据对象关联关系

来源:互联网 发布:mac rar解压软件 编辑:程序博客网 时间:2024/05/17 07:45
数据对象之间的3种关联关系:一对一一对多多对多
一对一,又有两种方式:主键关联,外键关联。
主键关联,两个表共享主表的主键,比如顾客(Customer)和登陆(Login)。
此例中,以Customer为主,Login为辅,也就是将Login的id的生成方式设置为foreign。
如此双向关联后,save/get谁都可以;因两边都设置了cascade="all",delete谁都可以。
[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. mysql> desc customer;  
  2. +-------+-------------+------+-----+---------+----------------+  
  3. | Field | Type        | Null | Key | Default | Extra          |  
  4. +-------+-------------+------+-----+---------+----------------+  
  5. | id    | int(4)      | NO   | PRI | NULL    | auto_increment |  
  6. name  | varchar(32) | YES  |     | NULL    |                |  
  7. +-------+-------------+------+-----+---------+----------------+  
  8.   
  9. mysql> desc login;  
  10. +----------+----------+------+-----+---------+----------------+  
  11. | Field    | Type     | Null | Key | Default | Extra          |  
  12. +----------+----------+------+-----+---------+----------------+  
  13. | id       | int(4)   | NO   | PRI | NULL    | auto_increment |  
  14. | username | char(20) | YES  |     | NULL    |                |  
  15. password | char(20) | YES  |     | NULL    |                |  
  16. +----------+----------+------+-----+---------+----------------+  
Customer.hbm.xml
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <hibernate-mapping>  
  2.     <class name="PO.Customer" table="customer" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="name" type="string">  
  8.             <column name="name" length="32" />  
  9.         </property>  
  10.         <!--映射Customer与Login的一对一的主键关联 -->  
  11.         <one-to-one name="login" class="PO.Login" cascade="all" />  
  12.     </class>  
  13. </hibernate-mapping>  
Login.hbm.xml
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <hibernate-mapping>  
  2.     <class name="PO.Login" table="login" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="foreign">  
  6.                 <param name="property">customer</param>  
  7.             </generator>  
  8.         </id>  
  9.         <property name="username" type="string">  
  10.             <column name="username" length="20" />  
  11.         </property>  
  12.         <property name="password" type="string">  
  13.             <column name="password" length="20" />  
  14.         </property>  
  15.         <!--映射Customer与Login的一对一关联 -->  
  16.         <one-to-one name="customer" class="PO.Customer" cascade="all"/>  
  17.     </class>  
  18. </hibernate-mapping>  
Customer.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package PO;  
  2.   
  3. public class Customer implements java.io.Serializable {  
  4.     private static final long serialVersionUID = 1L;  
  5.     private Integer id;  
  6.     private String name;  
  7.     private Login login;  
  8.   
  9.     public Customer() {  
  10.     }  
  11.   
  12.     public Customer(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     public Integer getId() {  
  17.         return this.id;  
  18.     }  
  19.   
  20.     public void setId(Integer id) {  
  21.         this.id = id;  
  22.     }  
  23.   
  24.     public String getName() {  
  25.         return this.name;  
  26.     }  
  27.   
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.   
  32.     public Login getLogin() {  
  33.         return login;  
  34.     }  
  35.   
  36.     public void setLogin(Login login) {  
  37.         this.login = login;  
  38.     }  
  39. }  
Login.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package PO;  
  2.   
  3. public class Login implements java.io.Serializable {  
  4.     private static final long serialVersionUID = 1L;  
  5.     private Integer id;  
  6.     private String username;  
  7.     private String password;  
  8.     private Customer customer;  
  9.   
  10.     public Login() {  
  11.     }  
  12.   
  13.     public Login(String username, String password) {  
  14.         this.username = username;  
  15.         this.password = password;  
  16.     }  
  17.   
  18.     public Integer getId() {  
  19.         return this.id;  
  20.     }  
  21.   
  22.     public void setId(Integer id) {  
  23.         this.id = id;  
  24.     }  
  25.   
  26.     public String getUsername() {  
  27.         return this.username;  
  28.     }  
  29.   
  30.     public void setUsername(String username) {  
  31.         this.username = username;  
  32.     }  
  33.   
  34.     public String getPassword() {  
  35.         return this.password;  
  36.     }  
  37.   
  38.     public void setPassword(String password) {  
  39.         this.password = password;  
  40.     }  
  41.   
  42.     public Customer getCustomer() {  
  43.         return customer;  
  44.     }  
  45.   
  46.     public void setCustomer(Customer customer) {  
  47.         this.customer = customer;  
  48.     }  
  49. }  
test.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package test;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.hibernate.Session;  
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.Transaction;  
  8. import org.hibernate.cfg.Configuration;  
  9.   
  10. import PO.Customer;  
  11. import PO.Login;  
  12.   
  13. public class test {  
  14.     @SuppressWarnings("deprecation")  
  15.     public static void main(String[] args) throws Exception {  
  16.         File file = new File("src/hibernate.cfg.xml");  
  17.         System.out.println("file path:" + file.getAbsolutePath());  
  18.         Configuration cfg = new Configuration().configure(file);  
  19.         SessionFactory sf = cfg.buildSessionFactory();  
  20.         Session session = sf.openSession();  
  21.         Transaction tx = session.beginTransaction();  
  22.   
  23.         Customer customer = new Customer();  
  24.         customer.setName("customer");  
  25.   
  26.         Login login = new Login();  
  27.         login.setUsername("test");  
  28.         login.setPassword("password");  
  29.         // PO对象之间相互设置关联关系  
  30.         customer.setLogin(login);  
  31.         login.setCustomer(customer);  
  32.   
  33.         Integer id = (Integer) session.save(customer);  
  34.         // Integer id = (Integer) session.save(login);  
  35.         System.out.println("save() id:" + id);  
  36.   
  37.         Customer new_customer = (Customer) session.get(Customer.class, id);  
  38.         if (new_customer != null) {  
  39.             Login tmp_login = new_customer.getLogin();  
  40.             System.out.println("id:" + new_customer.getId() + ",name:"  
  41.                     + new_customer.getName());  
  42.             System.out.println("id:" + tmp_login.getId() + ",username:"  
  43.                     + tmp_login.getUsername() + ",password:"  
  44.                     + tmp_login.getPassword());  
  45.         }  
  46.         Login new_login = (Login) session.get(Login.class, id);  
  47.         if (new_login != null) {  
  48.             Customer tmp_customer = new_login.getCustomer();  
  49.             System.out.println("id:" + tmp_customer.getId() + ",name:"  
  50.                     + tmp_customer.getName());  
  51.             System.out.println("id:" + new_login.getId() + ",username:"  
  52.                     + new_login.getUsername() + ",password:"  
  53.                     + new_login.getPassword());  
  54.         }  
  55.   
  56.         // session.delete(customer);  
  57.         session.delete(login);  
  58.         tx.commit();  
  59.         session.close();  
  60.         System.out.println("done.");  
  61.     }  
  62. }  


外键关联,两表有各自的主键,主表中有个外键,引用辅表的主键。它实际上是一对多的一种退化。
还以顾客(Customer)和登陆(Login)为例,主表需要增加一个字段(login),它作为外键来引用辅表的主键。
表结构改变后,可以简单理解为:多个顾客(实际上,却是全局唯一),共用一个登陆名。
[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. mysql> desc customer;  
  2. +-------+-------------+------+-----+---------+----------------+  
  3. | Field | Type        | Null | Key | Default | Extra          |  
  4. +-------+-------------+------+-----+---------+----------------+  
  5. | id    | int(4)      | NO   | PRI | NULL    | auto_increment |  
  6. name  | varchar(32) | YES  |     | NULL    |                |  
  7. | login | int(4)      | NO   | MUL | NULL    | 新增字段,作为外键|  
  8. +-------+-------------+------+-----+---------+----------------+  
Customer.hbm.xml
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <hibernate-mapping>  
  2.     <class name="PO.Customer" table="customer" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="name" type="string">  
  8.             <column name="name" length="32" />  
  9.         </property>  
  10.         <!--映射Customer与Login的一对一关联 -->  
  11.         <!--<one-to-one name="login" class="PO.Login" cascade="all"/> -->  
  12.         <many-to-one name="login" class="PO.Login" cascade="all"  
  13.             column="login" unique="true" />  
  14.     </class>  
  15. </hibernate-mapping>  
Login.hbm.xml
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <hibernate-mapping>  
  2.     <class name="PO.Login" table="login" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.             <!--<generator class="foreign">-->  
  7.                 <!--<param name="property">customer</param>-->  
  8.             <!--</generator>-->  
  9.         </id>  
  10.         <property name="username" type="string">  
  11.             <column name="username" length="20" />  
  12.         </property>  
  13.         <property name="password" type="string">  
  14.             <column name="password" length="20" />  
  15.         </property>  
  16.         <!--映射Customer与Login的一对一关联 -->  
  17.         <!--<one-to-one name="customer" class="PO.Customer" cascade="all" />-->  
  18.         <one-to-one name="customer" class="PO.Customer" cascade="all"  
  19.             property-ref="login" />  
  20.     </class>  
  21. </hibernate-mapping>  

PO对象以及测试代码,都跟主键关联的相同;测试结果,也相同。

一对一的关联关系,上一篇已经讲过了,这一篇只讲一对多。
下面以顾客(Customer)和订单(Order)为例,这是个典型的一对多的案例。
因为,每个顾客可以有多个订单,而每个订单只属于唯一的一个顾客。

[sql] view plaincopy
  1. mysql> desc customer;  
  2. +-------+-------------+------+-----+---------+----------------+  
  3. | Field | Type        | Null | Key | Default | Extra          |  
  4. +-------+-------------+------+-----+---------+----------------+  
  5. | id    | int(4)      | NO   | PRI | NULL    | auto_increment |  
  6. name  | varchar(32) | YES  |     | NULL    |                |  
  7. +-------+-------------+------+-----+---------+----------------+  
  8.   
  9. mysql> desc orders;  
  10. +----------+--------------+------+-----+---------+----------------+  
  11. | Field    | Type         | Null | Key | Default | Extra          |  
  12. +----------+--------------+------+-----+---------+----------------+  
  13. | id       | int(4)       | NO   | PRI | NULL    | auto_increment |  
  14. | money    | double(10,2) | YES  |     | NULL    |                |  
  15. | customer | int(4)       | YES  | MUL | NULL    |                |  
  16. +----------+--------------+------+-----+---------+----------------+  
Customer.hbm.xml
[html] view plaincopy
  1. <hibernate-mapping>  
  2.     <class name="PO.Customer" table="customer" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="name" type="string">  
  8.             <column name="name" length="32" />  
  9.         </property>  
  10.         <!--映射Customer与Orders的一对多的关联 -->  
  11.         <set name="orders" table="orders" cascade="all" inverse="true">  
  12.             <key column="customer" />  
  13.             <one-to-many class="PO.Order" />  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  
Order.hbm.xml
[html] view plaincopy
  1. <hibernate-mapping>  
  2.     <class name="PO.Order" table="orders">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="money" type="double">  
  8.             <column name="money" />  
  9.         </property>  
  10.         <many-to-one name="customer" class="PO.Customer" cascade="all"  
  11.             column="customer" />  
  12.     </class>  
  13. </hibernate-mapping>  
Customer.java
[java] view plaincopy
  1. package PO;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. public class Customer implements java.io.Serializable {  
  7.     private static final long serialVersionUID = 1L;  
  8.     private Integer id;  
  9.     private String name;  
  10.     private Set<Order> orders = new HashSet<Order>();  
  11.   
  12.     public Customer() {  
  13.     }  
  14.   
  15.     public Customer(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public Integer getId() {  
  20.         return this.id;  
  21.     }  
  22.   
  23.     public void setId(Integer id) {  
  24.         this.id = id;  
  25.     }  
  26.   
  27.     public String getName() {  
  28.         return this.name;  
  29.     }  
  30.   
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34.   
  35.     public Set<Order> getOrders() {  
  36.         return orders;  
  37.     }  
  38.   
  39.     public void setOrders(Set<Order> orders) {  
  40.         this.orders = orders;  
  41.     }  
  42. }  
Order.java
[java] view plaincopy
  1. package PO;  
  2.   
  3. public class Order implements java.io.Serializable {  
  4.     private static final long serialVersionUID = 1L;  
  5.     private Integer id;  
  6.     private Double money;  
  7.     private Customer customer;  
  8.   
  9.     public Order() {  
  10.     }  
  11.   
  12.     public Order(Double money) {  
  13.         this.setMoney(money);  
  14.     }  
  15.   
  16.     public Integer getId() {  
  17.         return this.id;  
  18.     }  
  19.   
  20.     public void setId(Integer id) {  
  21.         this.id = id;  
  22.     }  
  23.   
  24.     public Double getMoney() {  
  25.         return money;  
  26.     }  
  27.   
  28.     public void setMoney(Double money) {  
  29.         this.money = money;  
  30.     }  
  31.   
  32.     public Customer getCustomer() {  
  33.         return customer;  
  34.     }  
  35.   
  36.     public void setCustomer(Customer customer) {  
  37.         this.customer = customer;  
  38.     }  
  39. }  
test.java
[java] view plaincopy
  1. package test;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.hibernate.Session;  
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.Transaction;  
  8. import org.hibernate.cfg.Configuration;  
  9.   
  10. import PO.Customer;  
  11. import PO.Order;  
  12.   
  13. public class test {  
  14.     @SuppressWarnings("deprecation")  
  15.     public static void main(String[] args) throws Exception {  
  16.         File file = new File("src/hibernate.cfg.xml");  
  17.         System.out.println("file path:" + file.getAbsolutePath());  
  18.         Configuration cfg = new Configuration().configure(file);  
  19.         SessionFactory sf = cfg.buildSessionFactory();  
  20.         Session session = sf.openSession();  
  21.         Transaction tx = session.beginTransaction();  
  22.   
  23.         Customer customer = new Customer("customer");  
  24.         Integer id = (Integer) session.save(customer);  
  25.         System.out.println("save(customer) id:" + id);  
  26.   
  27.         Order order1 = new Order(1.1);  
  28.         // PO对象之间相互设置关联关系  
  29.         order1.setCustomer(customer);  
  30.         customer.getOrders().add(order1);  
  31.         Integer id1 = (Integer) session.save(order1);  
  32.         System.out.println("save(order1) id:" + id1);  
  33.   
  34.         Order order2 = new Order(2.2);  
  35.         // PO对象之间相互设置关联关系  
  36.         order1.setCustomer(customer);  
  37.         customer.getOrders().add(order2);  
  38.         Integer id2 = (Integer) session.save(order2);  
  39.         System.out.println("save(order2) id:" + id2);  
  40.   
  41.         Customer new_customer = (Customer) session.get(Customer.class, id);  
  42.         if (new_customer != null) {  
  43.             System.out.println("id:" + new_customer.getId() + ",name:"  
  44.                     + new_customer.getName());  
  45.             for (Order tmp_order : new_customer.getOrders()) {  
  46.                 System.out.println("id:" + tmp_order.getId() + ",money:"  
  47.                         + tmp_order.getMoney());  
  48.             }  
  49.         }  
  50.         Order new_order = (Order) session.get(Order.class, id1);  
  51.         if (new_order != null) {  
  52.             Customer tmp_customer = new_order.getCustomer();  
  53.             System.out.println("id:" + tmp_customer.getId() + ",name:"  
  54.                     + tmp_customer.getName());  
  55.             System.out.println("id:" + new_order.getId() + ",money:"  
  56.                     + new_order.getMoney());  
  57.         }  
  58.         session.delete(customer);  
  59.         // session.delete(order1);  
  60.         // session.delete(order2);  
  61.         tx.commit();  
  62.         session.close();  
  63.         System.out.println("done.");  
  64.     }  
  65. }  
这里建立了顾客和订单的双向关联,并且双方都是级联的,delete(order1)也能删除顾客及order2。
另外,要注意:建立Mysql数据库表时,不能将订单表(orders)命名为order(关键字?),否则报错:
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax 
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement

以商品(Item)和订单(Order)为例,这是个典型的多对多的案例。
因为,每个订单可以包含多种不同的商品,每种商品也可以拥有多个不同的订单。
多对多的关系,实际上完全可以拆分为两个一对多的关系(通常就这么用,效率高)
为了实现多对多的关系,还要为它们增加一个关系表(relations),用于保存其关系。

[sql] view plaincopy
  1. mysql> desc items;  
  2. +-------+-------------+------+-----+---------+----------------+  
  3. | Field | Type        | Null | Key | Default | Extra          |  
  4. +-------+-------------+------+-----+---------+----------------+  
  5. | id    | int(4)      | NO   | PRI | NULL    | auto_increment |  
  6. name  | varchar(20) | YES  |     | NULL    |                |  
  7. +-------+-------------+------+-----+---------+----------------+  
  8.   
  9. mysql> desc orders;  
  10. +-------+--------------+------+-----+---------+----------------+  
  11. | Field | Type         | Null | Key | Default | Extra          |  
  12. +-------+--------------+------+-----+---------+----------------+  
  13. | id    | int(4)       | NO   | PRI | NULL    | auto_increment |  
  14. | money | double(10,2) | YES  |     | NULL    |                |  
  15. +-------+--------------+------+-----+---------+----------------+  
  16.   
  17. mysql> desc relations;  
  18. +----------+--------+------+-----+---------+-------+  
  19. | Field    | Type   | Null | Key | Default | Extra |  
  20. +----------+--------+------+-----+---------+-------+  
  21. | item_id  | int(4) | NO   | PRI | 0       |       |  
  22. | order_id | int(4) | NO   | PRI | 0       |       |  
  23. +----------+--------+------+-----+---------+-------+  
Item.hbm.xml
[html] view plaincopy
  1. <hibernate-mapping>  
  2.     <class name="PO.Item" table="items" catalog="test">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="name" type="string">  
  8.             <column name="name" length="32" />  
  9.         </property>  
  10.         <!--映射Items与Orders的多对多的关联 -->  
  11.         <set name="orders" table="relations" cascade="all" inverse="true">  
  12.             <key column="item_id" />  
  13.             <many-to-many class="PO.Order" column="order_id" />  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  
Order.hbm.xml
[html] view plaincopy
  1. <hibernate-mapping>  
  2.     <class name="PO.Order" table="orders">  
  3.         <id name="id" type="int">  
  4.             <column name="id" />  
  5.             <generator class="identity" />  
  6.         </id>  
  7.         <property name="money" type="double">  
  8.             <column name="money" />  
  9.         </property>  
  10.         <!--映射Orders与Items的多对多的关联 -->  
  11.         <set name="items" table="relations" cascade="all">  
  12.             <key column="order_id" />  
  13.             <many-to-many class="PO.Item" column="item_id" />  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  
Item.java
[java] view plaincopy
  1. package PO;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. public class Item implements java.io.Serializable {  
  7.     private static final long serialVersionUID = 1L;  
  8.     private Integer id;  
  9.     private String name;  
  10.     private Set<Order> orders = new HashSet<Order>();  
  11.   
  12.     public Item() {  
  13.     }  
  14.   
  15.     public Item(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public Integer getId() {  
  20.         return this.id;  
  21.     }  
  22.   
  23.     public void setId(Integer id) {  
  24.         this.id = id;  
  25.     }  
  26.   
  27.     public String getName() {  
  28.         return this.name;  
  29.     }  
  30.   
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34.   
  35.     public Set<Order> getOrders() {  
  36.         return orders;  
  37.     }  
  38.   
  39.     public void setOrders(Set<Order> orders) {  
  40.         this.orders = orders;  
  41.     }  
  42. }  
Order.java
[java] view plaincopy
  1. package PO;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. public class Order implements java.io.Serializable {  
  7.     private static final long serialVersionUID = 1L;  
  8.     private Integer id;  
  9.     private Double money;  
  10.     private Set<Item> items = new HashSet<Item>();  
  11.   
  12.     public Order() {  
  13.     }  
  14.   
  15.     public Order(Double money) {  
  16.         this.setMoney(money);  
  17.     }  
  18.   
  19.     public Integer getId() {  
  20.         return this.id;  
  21.     }  
  22.   
  23.     public void setId(Integer id) {  
  24.         this.id = id;  
  25.     }  
  26.   
  27.     public Double getMoney() {  
  28.         return money;  
  29.     }  
  30.   
  31.     public void setMoney(Double money) {  
  32.         this.money = money;  
  33.     }  
  34.   
  35.     public Set<Item> getItems() {  
  36.         return items;  
  37.     }  
  38.   
  39.     public void setItems(Set<Item> items) {  
  40.         this.items = items;  
  41.     }  
  42. }  
test.java
[java] view plaincopy
  1. package test;  
  2.   
  3. import java.io.File;  
  4. import java.util.HashSet;  
  5.   
  6. import org.hibernate.Session;  
  7. import org.hibernate.SessionFactory;  
  8. import org.hibernate.Transaction;  
  9. import org.hibernate.cfg.Configuration;  
  10.   
  11. import PO.Item;  
  12. import PO.Order;  
  13.   
  14. public class test {  
  15.     @SuppressWarnings("deprecation")  
  16.     public static void main(String[] args) throws Exception {  
  17.         File file = new File("src/hibernate.cfg.xml");  
  18.         System.out.println("file path:" + file.getAbsolutePath());  
  19.         Configuration cfg = new Configuration().configure(file);  
  20.         SessionFactory sf = cfg.buildSessionFactory();  
  21.         Session session = sf.openSession();  
  22.         Transaction tx = session.beginTransaction();  
  23.   
  24.         Item item1 = new Item("item1");  
  25.         Integer id1 = (Integer) session.save(item1);  
  26.         System.out.println("save(item1) id:" + id1);  
  27.         Item item2 = new Item("item2");  
  28.         Integer id2 = (Integer) session.save(item2);  
  29.         System.out.println("save(item2) id:" + id2);  
  30.   
  31.         Order order1 = new Order(1.1);  
  32.         // PO对象之间相互设置关联关系  
  33.         HashSet<Item> items1 = new HashSet<Item>();  
  34.         items1.add(item1);  
  35.         order1.setItems(items1);  
  36.         item1.getOrders().add(order1);  
  37.         Integer oid1 = (Integer) session.save(order1);  
  38.         System.out.println("save(order1) id:" + oid1);  
  39.   
  40.         Order order2 = new Order(2.2);  
  41.         // PO对象之间相互设置关联关系  
  42.         HashSet<Item> items2 = new HashSet<Item>();  
  43.         items2.add(item2);  
  44.         order2.setItems(items2);  
  45.         item2.getOrders().add(order2);  
  46.         Integer oid2 = (Integer) session.save(order2);  
  47.         System.out.println("save(order2) id:" + oid2);  
  48.   
  49.         Order order3 = new Order(3.3);  
  50.         // PO对象之间相互设置关联关系  
  51.         HashSet<Item> items3 = new HashSet<Item>();  
  52.         items3.add(item1);  
  53.         items3.add(item2);  
  54.         order3.setItems(items3);  
  55.         item1.getOrders().add(order3);  
  56.         item2.getOrders().add(order3);  
  57.         Integer oid3 = (Integer) session.save(order3);  
  58.         System.out.println("save(order3) id:" + oid3);  
  59.   
  60.         Item new_item = (Item) session.get(Item.class, id1);  
  61.         if (new_item != null) {  
  62.             System.out.println("item id:" + new_item.getId() + ",name:"  
  63.                     + new_item.getName());  
  64.             for (Order tmp_order : new_item.getOrders()) {  
  65.                 System.out.println("id:" + tmp_order.getId() + ",money:"  
  66.                         + tmp_order.getMoney());  
  67.             }  
  68.         }  
  69.         Order new_order = (Order) session.get(Order.class, oid3);  
  70.         if (new_order != null) {  
  71.             System.out.println("order id:" + new_order.getId() + ",money:"  
  72.                     + new_order.getMoney());  
  73.             for (Item tmp_item : new_order.getItems()) {  
  74.                 System.out.println("id:" + tmp_item.getId() + ",name:"  
  75.                         + tmp_item.getName());  
  76.             }  
  77.         }  
  78.   
  79.         // session.delete(item1);  
  80.         // session.delete(item2);  
  81.         // session.delete(order1);  
  82.         // session.delete(order2);  
  83.         // session.delete(order3);  
  84.         tx.commit();  
  85.         session.close();  
  86.         System.out.println("done.");  
  87.     }  
  88. }  

0 0