composite-element的典型用法
1、情景描述
顾客Customer下订单Order,Order里面包含很多条目Item及各条目的数量quantity信息。Customer和Order是一对多的关系;Order和Item是多对多的关系。
2、数据库结构
orders表:{ orderId , orderName }
item表:{ itemId , itemName }
order_item表:{ orderId , itemId , quantity }
3、Order.hbm.xml
<
hibernate-mapping
>
< class name ="com.persistent.Order" table ="orders" >
< id name ="id" column ="orderId" unsaved-value ="null" >
< generator class ="increment" ></ generator >
</ id >
< property name ="name" column ="orderName" ></ property >
< set name ="perchaseItems" table ="order_item" lazy ="false" cascade ="save-update" >
< key column ="orderId" ></ key >
< composite-element class ="com.persistent.Perchase" >
< property name ="quantity" ></ property >
< many-to-one name ="item" column ="itemId" class ="com.persistent.Item" lazy ="false" ></ many-to-one >
</ composite-element >
</ set >
</ class >
</ hibernate-mapping >
< class name ="com.persistent.Order" table ="orders" >
< id name ="id" column ="orderId" unsaved-value ="null" >
< generator class ="increment" ></ generator >
</ id >
< property name ="name" column ="orderName" ></ property >
< set name ="perchaseItems" table ="order_item" lazy ="false" cascade ="save-update" >
< key column ="orderId" ></ key >
< composite-element class ="com.persistent.Perchase" >
< property name ="quantity" ></ property >
< many-to-one name ="item" column ="itemId" class ="com.persistent.Item" lazy ="false" ></ many-to-one >
</ composite-element >
</ set >
</ class >
</ hibernate-mapping >
4、Item.hbm.xml
<
hibernate-mapping
>
< class name ="com.persistent.Item" table ="item" >
< id name ="id" column ="itemId" unsaved-value ="null" >
< generator class ="increment" >
</ generator >
</ id >
< property name ="name" column ="itemName" ></ property >
</ class >
</ hibernate-mapping >
< class name ="com.persistent.Item" table ="item" >
< id name ="id" column ="itemId" unsaved-value ="null" >
< generator class ="increment" >
</ generator >
</ id >
< property name ="name" column ="itemName" ></ property >
</ class >
</ hibernate-mapping >
5、Order.java、Item.java和Perchase.java
public
class
Order
...
{
private Long id;
private String name;
private Set purchaseItems = new HashSet();
...
}
public class Item ... {
private Long id;
private String name;
...
}
public class Perchase ... {
private int quantity;
private Item item;
...
}
private Long id;
private String name;
private Set purchaseItems = new HashSet();
...
}
public class Item ... {
private Long id;
private String name;
...
}
public class Perchase ... {
private int quantity;
private Item item;
...
}
6、测试代码
Session session
=
HibernateSessionFactory.getSession();
session.beginTransaction();
List result = session.createQuery( " from Order " ).list();
for ( int i = 0 ; i < result.size(); i ++ ) ... {
Order order = (Order)result.get(i);
System.out.println(order.getId()+" "+order.getName());
Set perchases = order.getPurchaseItems();
for(Iterator it = perchases.iterator(); it.hasNext();)...{
Perchase perchase = (Perchase)it.next();
System.out.print(perchase.getQuantity()+" ");
System.out.println(perchase.getItem().getId()+" "+perchase.getItem().getName());
}
}
session.getTransaction().commit();
session.beginTransaction();
List result = session.createQuery( " from Order " ).list();
for ( int i = 0 ; i < result.size(); i ++ ) ... {
Order order = (Order)result.get(i);
System.out.println(order.getId()+" "+order.getName());
Set perchases = order.getPurchaseItems();
for(Iterator it = perchases.iterator(); it.hasNext();)...{
Perchase perchase = (Perchase)it.next();
System.out.print(perchase.getQuantity()+" ");
System.out.println(perchase.getItem().getId()+" "+perchase.getItem().getName());
}
}
session.getTransaction().commit();