Lernprogramm zum EntityManager: Einträge über eine Abfrage aktualisieren und entfernen

Sie können Entitäten über eine Abfrage aktualisieren und entfernen.

Vorgehensweise

Aktualisieren und entfernen Sie Entitäten über eine Abfrage.
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;  } 
Die Entitätsklasse "Order" ist dieselbe wie im vorherigen Beispiel. Die Klasse stellt die Annotation "@Index" weiterhin bereit, weil die Abfragezeichenfolge das Datum verwendet, um die Entität zu finden. Die Abfragesteuerkomponente verwendet Indizes, wenn sie verwendet werden können.
public static void cancelOrdersUsingQuery(Session s) {
        // Alle Aufträge stornieren, die in der letzten Minute übergeben wurden
        java.util.Date cancelTime = 
					new java.util.Date(System.currentTimeMillis() - 60000);
        EntityManager em = s.getEntityManager();
        em.getTransaction().begin();
        
        // Abfrage erstellen, die den Auftrag nach Datum sucht. Da
        // ein Index für das Auftragsdatum definiert ist, wird er
				    // von der Abfrage automatisch verwendet.
        Query query = em.createQuery("SELECT order FROM Order order 
					WHERE order.date >= ?1");
        query.setParameter(1, cancelTime);
        Iterator<Order> orderIterator = query.getResultIterator();         
			 while(orderIterator.hasNext()) {             
					Order order = orderIterator.next();             
  			// Sicherstellen, dass der Auftrag nicht von einer anderen Person geändert wurde            
					// Da die Abfrage einen Index verwendet, ist keine Sperre für die Zeile gesetzt.            
					if(order != null && order.date.getTime() >= cancelTime.getTime()) {                 
							for(OrderLine line : order.lines) {                     
								// Artikel wieder dem Bestand hinzufügen.                    
								line.item.quantityOnHand += line.quantity;                     
								line.quantity = 0;                 
							}                 
							em.remove(order);             
					}         
			}         
em.getTransaction().commit();}
Wie im vorherigen Beispiel beabsichtigt die Methode "cancelOrdersUsingQuery", alle Aufträge zu stornieren, die in der letzten Minute übergeben wurden. Zum Stornieren des Auftrags, suchen Sie den Auftrag über eine Abfrage, fügen Sie die Artikel aus dem Auftrag dem Bestand wieder hinzu, und entfernen Sie den Auftrag und die zugeordneten Positionen aus dem System.