エンティティー・マネージャーのチュートリアル: 索引によるエントリーの更新と除去

索引を使用して、エンティティーを検索、更新、および除去することができます。

手順

更新を使用してエンティティーを更新および除去します。 索引を使用して、エンティティーを検索、更新、および除去することができます。 以下の例では、Order エンティティー・クラスを更新して、@Index アノテーションを使用します。@Index アノテーションは、属性の範囲索引で作成するよう WebSphere® eXtreme Scale に通知します。 索引の名前は属性の 名前と同じで、常に MapRangeIndex 索引型です。
Order.java
@Entity
public class Order
{
    @Id String orderNumber;
    @Index java.util.Date date;
    @OneToOne(cascade=CascadeType.PERSIST) Customer customer;
    @OneToMany(cascade=CascadeType.ALL, mappedBy="order") 
				@OrderBy("lineNumber") List<OrderLine> lines;  } 
以下の例では、直前にサブミットされたすべてのオーダーを取り消す方法を示しています。索引を 使用してオーダーを検索し、オーダーの品目を在庫に戻し、オーダーおよびそれに関連する明細行をシステムから削除します。
public static void cancelOrdersUsingIndex(Session s) 
		throws ObjectGridException {
    // Cancel all orders that were submitted 1 minute ago
    java.util.Date cancelTime = new 
			java.util.Date(System.currentTimeMillis() - 60000);
    EntityManager em = s.getEntityManager();
    em.getTransaction().begin();
    MapRangeIndex dateIndex = (MapRangeIndex) 
			s.getMap("Order").getIndex("date");
    Iterator<Tuple> orderKeys = dateIndex.findGreaterEqual(cancelTime);     
		while(orderKeys.hasNext()) {         
			Tuple orderKey = orderKeys.next();         
			// Find the Order so we can remove it.         
			Order curOrder = (Order) em.find(Order.class, orderKey);         
			// Verify that the order was not updated by someone else.         
			if(curOrder != null && curOrder.date.getTime() >= cancelTime.getTime()) {
				for(OrderLine line : curOrder.lines) {                 
					// Add the item back to the inventory.                 
					line.item.quantityOnHand += line.quantity;                 
					line.quantity = 0;             
				}             
			em.remove(curOrder);         
			}     
		}     
	em.getTransaction().commit(); 
}