2017-07-25 3 views
0

Ich habe eine Entität namens Product. Es hat mehrere Felder und Benutzer kann ein oder mehrere Felder davon beliebig aktualisieren. Für die Aktualisierung Product s, ich weiß, ich beibehaltenen Produkt von DB erhalten und aktualisieren es Felder und save es wieder, aber diese Ursache wirkliche Leistungseinbuße. Der bessere Weg ist das Erstellen von benutzerdefinierten Update-Abfragen in ProductRepostory Schnittstelle, aber in diesem Fall sollte ich mehrere Update-Funktionen für jedes Szenario schreiben. Ich möchte eine Map<String,Object> Aktualisierung von Feldern und deren Werte erhalten und eine Abfrage schreiben, um das Thema proportional zu aktualisieren.Komplexe und schnelle Aktualisierung im Frühjahr Daten JPA

ich hörte, dass Hibernate Fähigkeit, benutzerdefinierte Update-Abfrage zu erstellen hat, und führen Sie wie Code unter

@Stateless 
@LocalBean 
public class OrderManagement { 
    @PersistenceContext 
    private EntityManager em; 

    ... 

    public void updateOrder(Double oldAmount, Double newAmount) { 
     CriteriaBuilder cb = this.em.getCriteriaBuilder(); 

     // create update 
     CriteriaUpdate<Order> update = cb. 
     createCriteriaUpdate(Order.class); 

     // set the root class 
     Root e = update.from(Order.class); 

     // set update and where clause 
     update.set("amount", newAmount); 
     update.where(cb.greaterThanOrEqualTo(e.get("amount"), oldAmount)); 

     // perform update 
     this.em.createQuery(update).executeUpdate(); 
    } 

} 

Aber ich frage mich, wie diese Daten im Frühjahr JPA Umständen zu verwenden, die größte Frage ist, wie EntityManager zu bekommen Instanz, und nächste ist, wo ist der am besten geeignete Ort, um diese Funktionalität zu setzen? ProductRepostory Schnittstelle oder einige benutzerdefinierte Schnittstelle, Und wenn Antwort benutzerdefinierte Schnittstelle ist, wie man es registriert?

+0

https://dzone.com/articles/add-custom-funktionality-to-a-spring-data-reposito Sie können das benutzerdefinierte Repository in Spring Data in dem obigen Link finden. –

+0

Auch Entity Manager kann so injiziert werden. '@PersistenceContext EntityManager EntityManager;' –

+1

1. Sie nicht brauchen, um es wieder zu sparen: Hibernate für Sie tut das. 2. Nein, dies verursacht keine wirklichen Leistungseinbußen. Das Lesen einer Zeile in einer Tabelle anhand ihrer ID ist extrem schnell. Sie optimieren vorzeitig, was die Wurzel allen Übels ist. Ihr Code wird viel komplexer und weniger sicher für einen imaginären Leistungsgewinn. –

Antwort

0

OK, der Hauptgrund, diese Frage zu stellen, war eine falsche Hypothese, dass ich dachte, dass das Holen und Aktualisieren einer Entität im Programm Leistungsprobleme verursachen kann. Aber wie @JBNizet erwähnt hat, ist das Holen einer Entität per ID schnell und auch Hibernate behandelt persistente Änderungen an Entity und es ist nicht erforderlich, save manuell aufzurufen.

Um Punkt gebracht, VORSCHLAGEN neue Methoden der ENTITIES SPAR MANAGED ist nicht hilfreich, und es ist besser zu aktualisieren ENTITY MANUALLY zu vermeiden, aber wenn man manuell JPA-Repositorys verlängern will, ist es nice article, dass sie erklären, wie sie genannt wurden in Kommentaren.

Verwandte Themen