Entity manager tutorial: Updating and removing entries with an index
You can use an index to find, update, and remove entities.
Procedure
Update and remove entities by using an index.
Use an index to find, update,
and remove entities. In the following examples, the Order entity class is updated to use the @Index
annotation. The @Index annotation signalsWebSphere® eXtreme Scale to create a
range index for an attribute. The name of the index is the same name as the name of the attribute
and is always a MapRangeIndex index type.
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; }
The following example demonstrates how to cancel all orders that are submitted within
the last minute. Find the order by using an index, add the items in the order back into the
inventory, and remove the order and the associated line items from the
system.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();
}