关于两个实体发生关联产生新的属性

两个实体发生关联,并产生新的属性,比如订单和产品,直接发生关系,会产生数量这个属性。这个时候有两种方式解决:

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>

xml 代码
  1. <list name="orderItem" table="line_itme" lazy="true" inverse="false" optimistic-lock="true">  
  2.    <key column="order_id" />  
  3.    <index column="item_number" />  
  4.       
  5.    <composite-element class="com.us.ebuy.model.OrderItem">  
  6.     <property name="quantity" />  
  7.     <property name="productTotal"/>  
  8.     <many-to-one name="product" column="product_id" outer-join="true"/>  
  9.    </composite-element>  
  10.   </list>  
  11.   

<many-to-one name="product" column="product_id" outer-join="true"></many-to-one>note:invser=false,表明OrderItem的添加,更新,删除操作均要通过Order来完成

<key column="order_id"></key>

xml 代码
  1. <key column="order_id" />  
  2. <index column="item_number" />  


<index column="item_number"></index>
这两项配置确实一条item记录,其中key元素对应Order的Key,而index是一个序号,和List中的get(int index)相对应,从0开始。

对orderItem的操作:

插入和更新可以按一般的方法处理,就不多说了

删除方法:

java 代码
  1. List list = tOrder.getOrderItem();   
  2. Vector vector = new Vector(id.length);   
  3. for (int i = 0; i < id.length; i++) {   
  4.  vector.add(list.get(Integer.parseInt(id[i])));   
  5. }   
  6. list.removeAll(vector);  

只有通过集合方式删除,如果按序号删除,每删除一个序号会变化(我想应该是这样子的),我测试过,那种删除不会成功的。

2)第二种方法是把OrderItem则单独提出来,成为一个独立的实体,和一般的many-to-one一样处理

这样做的好处就在对OrderItem操作的时候就不用老跟Order打交道了。当然在面向对象的设计上来看,就觉得怪怪的,反正灵活使用,就OK了

在Java中,如果你有两个实体类(Entity),比如User和Address,它们之间可能存在关联,如User有一个Address对象。如果你想在程序中将一个User对象转换成包含其Address信息的对象,通常有几种方式: 1. **深拷贝(Deep Copying)**: 如果User和Address都是简单数据类型,可以直接创建一个的地址实例,并复制User中的属性值。例如: ```java Address newAddress = new Address(); newAddress.setName(user.getAddress().getName()); //... 其他属性复制 User newUser = new User(); newUser.setAddress(newAddress); ``` 2. **浅拷贝(Shallow Copying)**: 对于复杂对象,尤其是包含引用类型的对象,浅拷贝只是复制了引用,所以如果地址是一个集合或其他对象,需要分别处理: ```java Address newAddress = user.getAddress(); // 这里是浅拷贝 newUser.setAddress(newAddress); // 或者对集合等深拷贝,具体取决于库支持 List<Address> copiedAddresses = new ArrayList<>(user.getAddresses()); newUser.setAddresses(copiedAddresses); ``` 3. **序列化与反序列化**(Serialization & Deserialization): 当两个实体类都有默认的序列化机制,可以先将User对象序列化为字节流,然后解析成的Address对象: ```java byte[] serializedUser = SerializationUtils.serialize(user); Address newAddress = SerializationUtils.deserialize(Address.class, serializedUser); ``` 4. **利用JSON库**(如Jackson、Gson等)将实体对象转换为JSON字符串,再从JSON字符串重构另一个实体对象。 每种方法的选择取决于具体的需求和上下文。在实际操作时要注意避免内存泄漏等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值