关于内嵌对象(Embedded Object)缓存设计的问题

我在修改jpetstore这个项目时,发现如果用户查询自己以前的订单时,需要查询Item,所以我想让Item成为成为order.LineItem的内嵌对象的,这时就想到了用banq老师讲内嵌对象缓存设计的问题,我是这样用的
我先说原来没有用内嵌对象时的设计:
Class OrderSqlMapDao{
...........
public Order getOrder(int orderId) throws SQLException {
Order order = null;
Object parameterObject = new Integer(orderId);
order = (Order) sqlMapDaoTemplate.queryForObject("getOrder",
parameterObject);
List lineItems = sqlMapDaoTemplate.queryForList(
"getLineItemsByOrderId", new Integer(order.getOrderId()));
Iterator it = lineItems.iterator();
while (it.hasNext()) {
LineItem lineItem = (LineItem) it.next();
parameterObject = lineItem.getItemId();
lineItem.setItem((Item) sqlMapDaoTemplate.queryForObject("getItem",
parameterObject));
}
order.setLineItems(lineItems);
return order;
}
..............
}
[该贴被sdaucs于2008-04-23 13:15修改过]
然后我又用了内嵌设计
下面修改的OrderServiceImp类
Class OrderServiceImp{
...............
private ProductManager productManager;
..............
public Order getOrder(Integer orderId) {
Order order = null;
try {
order = orderDao.getOrder(orderId);

// 内嵌对象(Embedded Object)缓存设计
Iterator it = order.getLineItems().iterator();
while (it.hasNext()) {
LineItem lineItem = (LineItem) it.next();
Item item = productManager.getItem(lineItem.getItemId());
lineItem.setItem(item);
}

} catch (Exception daoe) {
Debug.logError(" Dao error : " + daoe, module);
}
return order;
}
............
}

下面是OrderSqlMapDao类
Class OrderSqlMapDao{
.............
public Order getOrder(int orderId) throws SQLException {
Order order = null;
Object parameterObject = new Integer(orderId);
order = (Order) sqlMapDaoTemplate.queryForObject("getOrder",
parameterObject);
List lineItems = sqlMapDaoTemplate.queryForList(
"getLineItemsByOrderId", new Integer(order.getOrderId()));
order.setLineItems(lineItems);
return order;
}
..............
}

可是从jboss的控制台上看,item还是没有缓存!我也不知道是怎么回事!

你新增的Item 需要缓存有两个条件:
1. item实现modelif接口

2. 需要客户端单独对item的get获取。在这种情况下,缓存机制发挥作用,item在缓存内,但是如果你在Order中也有一份item,那么要保证这两个item是同一个,否则乱了。这是我提出内嵌对象的目的。

[该贴被banq于2008-04-24 09:08修改过]

1. item继承了model类
2. item也在jdonframework.xml里面配置了

首先查询items的时候,已经将item缓存了,
然后当查询order的时候,需要调用item这个缓存,但是通过jboss控制台,我看到好像系统有查询了一次item,并重新缓存了.我也不知道是怎么回事!