我正在實施一個在線商店。我有保存命令下面的代碼: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