两个实体发生关联,并产生新的属性,比如订单和产品,直接发生关系,会产生数量这个属性。这个时候有两种方式解决:
1)把订单项设置成为order的一个组合元素,如使用List
public class Order extends BaseObject {
/**
* 定单编号
*/
protected String orderSN;
/**
* 下订时间
*/
protected Date orderTime;
.............................................
/**
* 订单项
*/
protected List orderItem = new ArrayList();
..................................................................//省略其它属性
}
OrderItem.java
*/
public class OrderItem extends BaseObject {
/**
* 产品
*/
protected Product product;
/**
* 产品数量
*/
protected Integer quantity;
...................................//省略其它属性
}
这样就建立了两个实体的联系,再看配置文件Order.hbm.xml中关于List的配置
<list name="orderItem" table="line_itme" inverse="false" optimistic-lock="true" lazy="true"></list>
- <list name="orderItem" table="line_itme" lazy="true" inverse="false" optimistic-lock="true">
- <key column="order_id" />
- <index column="item_number" />
- <composite-element class="com.us.ebuy.model.OrderItem">
- <property name="quantity" />
- <property name="productTotal"/>
- <many-to-one name="product" column="product_id" outer-join="true"/>
- </composite-element>
- </list>
<many-to-one name="product" column="product_id" outer-join="true"></many-to-one>note:invser=false,表明OrderItem的添加,更新,删除操作均要通过Order来完成
<key column="order_id"></key>
- <key column="order_id" />
- <index column="item_number" />
<index column="item_number"></index>
这两项配置确实一条item记录,其中key元素对应Order的Key,而index是一个序号,和List中的get(int index)相对应,从0开始。
对orderItem的操作:
插入和更新可以按一般的方法处理,就不多说了
删除方法:
- List list = tOrder.getOrderItem();
- Vector vector = new Vector(id.length);
- for (int i = 0; i < id.length; i++) {
- vector.add(list.get(Integer.parseInt(id[i])));
- }
- list.removeAll(vector);
只有通过集合方式删除,如果按序号删除,每删除一个序号会变化(我想应该是这样子的),我测试过,那种删除不会成功的。
2)第二种方法是把OrderItem则单独提出来,成为一个独立的实体,和一般的many-to-one一样处理
这样做的好处就在对OrderItem操作的时候就不用老跟Order打交道了。当然在面向对象的设计上来看,就觉得怪怪的,反正灵活使用,就OK了