我正在实施一个在线商店。我有保存命令下面的代码:Spring + JPA:对象不会从数据库中获取
@Service
@Transactional
public class OrderServiceImpl extends GenericServiceImpl<Order, Integer> implements OrderService {
@Inject
private ItemRepository itemRepository;
@Override
public void saveOrder(Order order) {
this.updateItemsAccordingToOrderedQuantities(order);
repository.save(order);
}
private void updateItemsAccordingToOrderedQuantities(Order order) {
List<OrderedItem> orderedItems = order.getOrderedItems();
for (OrderedItem orderedItem : orderedItems) {
// fetch from database
Item item = itemRepository.findOne(orderedItem.getItem().getId());
item.reduceWeightInColdStoreBy(orderedItem.getWeight());
itemRepository.update(item);
}
}
}
其实之前保存订单我更新每个项目的“权重”属性(一定量的获取与此顺序出售,所以有较少左)。
OrderedItem
对象保存在参考Item
,但我想从数据库中获取新鲜Item
(额外检查有足够的销售,万一Item
表在数据库中更改和UI没有用户提交订单前更新)。 findOne
方法,我呼吁这个目的的实现如下:
@Repository
public class GenericRepositoryImpl<T, ID extends Serializable> implements GenericRepository<T, ID> {
@PersistenceContext
EntityManager em;
protected Class<T> entityClass;
public GenericRepositoryImpl(Class<T> entityClass) {
this.entityClass = entityClass;
}
@Override
public T findOne(ID id) {
return em.find(entityClass, id);
}
}
通话完后item
不null
,但它不是从数据库中获取:我的EclipseLink日志功能,在“最美好”的水平,并且没有SELECT
查询。
我认为这是因为EclipseLink在其持久性上下文中有这item
,所以它不执行查询。所以我已经尝试在return
之前在findOne
方法实现中加入em.clear()
,但它没有帮助。
我该如何从数据库中实际获得新的item
?
预先感谢您。
P.S.我试着明确查询我findOne
方法,像这样:
@Override
public T findOne(ID id) {
T result = null;
try {
TypedQuery<T> query = em.createQuery("SELECT e FROM " + entityClass.getName() + " e", entityClass);
result = query.getSingleResult();
} catch (RuntimeException e) {
e.printStackTrace();
}
return result;
}
这样,我得到异常:java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: [email protected]
。我不知道为什么,因为我没有做persist
。
使用Spring构建在线商店是个不错的主意。我也想这样做。你能推荐任何有用的资料来源吗? – burseaner 2014-12-16 18:45:17