JPA: Kann ich die Kraft, die Objekte beibehalten werden, um die Datenbank in der Reihenfolge, in der Objekte, die geschickt wurden, um persist()?
Ich bin die Schaffung eines billing-Systems verwaltet ein Ledger für jeden Kunden. Jedes Sachkonto verfügt über eine Liste von LedgerEntry die Aufzeichnungen jeden Kunden Transaktion.
Als ich dieses zu testen, habe ich gemerkt, dass wenn ich ein paar LedgerEntry die innerhalb der gleichen Transaktion, die @Id-Wert war nicht in Ordnung, dass die Gegenstände gegeben, em.persist(), es sei denn, ich habe eine em.flush() nach jedem Eintrag wird erstellt.
Da verlasse ich mich auf die Reihenfolge der id für das richtige Verhalten der Finanzbuchhaltung (insbesondere der aktuelle Saldo ist der Letzte LedgerEntry in der Liste-erzwungen durch ein @OrderBy "id ASC"), das bedeutet, dass ich flush() ein paar mal.
Gibt es eine Möglichkeit zu vermeiden, die Spülung nach jeder Zeile angelegt? Das ist, um irgendeine Art der Bestellung, wie die Objekte persistent gespeichert werden, ohne mit einer @OrderColumn?
InformationsquelleAutor Toybuilder | 2010-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob das generische JPA oder Hibernate-nur, aber beachten Sie den Unterschied zwischen Ruhezustand ist
persist()
undsave()
. Von die docs (Hervorhebung von mir):Also, wenn Sie
save()
IDs generiert werden sollen, in der Reihenfolge, die Sie aufrufensave()
. Wenn ein insert um die ID ist problematisch (für performance usw.) können Sie wählen eine andere ID-generator, der nicht erforderlich ist, schlagen die Datenbank.in der Tat, daher mein Erster Satz. Ich habe nur verwendet Hibernate; ich weiß, es ist eine Implementierung von JPA, sondern enthält eine Reihe von Erweiterungen. Es ist mir nicht klar, nicht dass Sie der 'Reine' JPA, wenn
save
ist ein Hibernate-Erweiterung oder wenn es den Auftrag durch die JPA spec.JPA nicht ein äquivalent Hibernate
save
, JPA nur definiertpersist
. So hätten Sie zum Auspacken dessession
"verpackt" durch dieEntityManager
zu verwendensave
, vorausgesetzt, Hibernate verwendet wird, als JPA-provider natürlich. Aber dieser jemand, den Niederlagen die Idee der Verwendung von JPA. Wie auch immer, ich glaube immer noch, die OP sollte sich nicht darauf verlassen, dass Sie auf den PK 🙂Ah ha!!! Ich bin mit einer identity-generator eher als Sequenzen. Ich weiß, dass ich ein Projekt an dem ich gearbeitet habe, mit in der Vergangenheit, kann der client bekommt eine Sequenznummer block fromt er db-server, und verwenden Sie die Sequenz-Nummern, ohne auf die Datenbank für jede Sequenz-Nummer.
InformationsquelleAutor Cowan
Ich bin mir nicht ganz sicher, ich verstehe Ihre Struktur.
Sollten Sie in der Lage sein, zu Sortieren, einen einzigen Geschäftsvorfall (mehrere LedgerEntry Zeilen?) durch transaction_timestamp, um die richtige Reihenfolge.
Aber warum ist der aktuelle Saldo Zeile in der Tabelle überhaupt? Es konnte berechnet werden, ja?
Wenn der aktuelle Saldo Zeile hat da zu sein, ich würde erstellen Sie eine line_item_number Spalte und weisen Sie die Werte nacheinander für jede business Transaktion. Dies wird wahrscheinlich machen Sie eine schöne und einzigartige Schlüssel, wenn gepaart mit der Ledger-id. Und ich würde weisen Sie den aktuellen Saldo Zeile einen Magie-Wert von 999999, so wäre es immer Sortieren Letzte.
Ein netter Nebeneffekt ist, dass die Auswahl der geschuldete Betrag aus der Tabelle ist wirklich einfach - die Summe aller Zeilen, in denen line_item_number = 999999.
Meine Präferenz wäre allerdings, entfernen Sie die current_balance Reihe und sehen Sie die Probleme einfach Weg.
Eine andere Möglichkeit ist, den computer current_balance in der Finanzbuchhaltung und nicht haben es als eine LedgerEntry Zeile.
BTW, der Zeitstempel funktioniert nicht in diesem Fall, weil JPA schreibt das Hauptbuch-Eintrag Reihen sich alle zur gleichen Zeit - so dass alle Einträge den gleichen Zeitstempel. Die einzige Art und Weise, flush (), um die Datenbank nach jeder Zeile angelegt, das ist im Grunde das, was ich Tue.
InformationsquelleAutor Tony Ennis
Und die ids generiert werden, mit welcher Methode ? Sequenz ? Tabelle ? Benutzer-zugeordnet ?
Es gibt keine Garantie, wie erwähnt von anderen Antworten, die Reihenfolge der Zuordnung aber, wenn die generation, die Methode ist nicht abhängig von der datastore dann die meisten Implementierungen setzen Sie den Wert zum Zeitpunkt des Aufrufs von "beibehalten". Wenn die generation-Methode OTOH nutzt die datastore-dann haben Sie, um flush zu erzwingen, dieses datastore-Kontakt.
InformationsquelleAutor DataNucleus
Meines Wissens nach, gibt es nichts über die Reihenfolge der Anweisungen und die Reihenfolge der
EntityManager
Methodenaufrufe in der spec. Also ich würde wirklich nicht darauf verlassen, dass, selbst wenn Ihr provider ermöglicht es konfiguriert werden, über eine Art eigene Einstellungen oder bietet dieses Verhalten standardmäßig.Aber eigentlich, wenn Sie benötigen, um mit geordneten Liste, würde es IMO sehr viel Sinn machen, um eine Spalte zu halten, die hartnäckig um und definieren es mit einem
OrderColumn
. Man sollte IMO sich nicht auf die PK für geschäftliche Dinge.Meiner Meinung nach, die PK-ist eine technische Sache, nicht eine business-Sache, vor allem da die Reihenfolge ist nicht garantiert. Aber das ist nur meine Meinung 🙂
InformationsquelleAutor Pascal Thivent