Es gibt zwei verbleibende Probleme im Einkaufswagen, nämlich die kaskadierte Speicherung von Bestellinformationen und Seitencache. Die Informationen hier beziehen sich auf den Einkaufswagen und Einkaufsgegenstände. Wenn wir die Informationen des Einkaufswagens in der Datenbank speichern, speichern wir auch die Informationen zu jedem Einkaufsgegenstand, und die ausländischen Schlüssel sind verwandt, was das kaskadierte Speicherproblem in Hibernate betrifft. Das Problem des Seitencache bezieht sich auf die Zeit, als der Benutzer die Bestellung bestätigt. Wenn er zurückklickt, kehrt er zur Bestellbestätigungsseite zurück. Die Auftragsbestätigungsseite erscheint gerade noch einmal und die Sitzung ist noch vorhanden, und die Informationen sind noch die Informationen. Dies ist offensichtlich nicht das Ergebnis, das wir wollen, und wir werden es später nacheinander analysieren. In diesem Abschnitt werden hauptsächlich die kaskadierenden Inventare von Auftragsinformationen und das zwischeneinandergebrauchte Zwischenspeichern erörtert.
1. Kaskadierspeicher von Bestellinformationen
Der kaskadierende Speicher von zwei verwandten Tabellen in Hibernate muss konfiguriert werden. Hier stellen wir hauptsächlich die Konfigurationsmethode der Anmerkungen vor. Das Pojo des Ordens ist Fder, das Pojo des Einkaufsgegenstands ist Sorder, und der Fder und Sorder sind eins-zu-viele-Beziehungen. Lassen Sie uns zunächst ihre Annotationskonfiguration wie folgt festlegen:
@Entity Public Class Forder implementiert java.io.serializable {// irrelevante Code weglassen ... private Liste <Sorder> Soorders = New ArrayList <Sorder> (); @Onetomany (Cascade = Cascadetype.All, fetch = fetchType.lazy, mapappedby = "fder") publiclist <Sorder> getOrters () {return this.Storders; } public void setSordner (Liste <Sorder> Soorders) {this.Sorders = Soorders; }} @Entity public class sorder implementiert java.io.serializable {// irrelevante Code weglassen ... privates Forder Forder; @Manytoone (fetch = fetchType.lazy) @Joincolumn (name = "fid") public fderforder () {return this.forder; } public void setForder (fderer fder) {this.forder = fder; }} Nach dieser Konfiguration speichern wir beim Speichern von Werbebuchungen auch die Einkaufsgegenstände und verknüpfen automatisch ausländische Schlüssel. Die Prämisse ist jedoch, dass wir die Beziehung zwischen ihnen, dh SetSOrters () im Fder, SetForder () im Soorder, und Eigenschaften in den Entitäten, die anderen verwandten Fremdschlüssel entsprechen, festlegen müssen.
Als wir zuvor den Einkaufsgegenstand zum Einkaufswagen hinzufügten, wurde Forder.setsorder (Sorder) ausgeführt. Jetzt müssen wir den Soorder Färder hinzufügen, also fügen wir es dem Originalcode wie folgt hinzu:
// Dies ist der Code in Abschnitt 17. Wir fügen einen Satz in die Mitte @Service ein ("SORDERService") öffentliche Klasse SORDERServiceImpl erweitert BaseServiceImpl <Sorder> implementiert SORDERService {@Override Public Forder addSorder (Forder Forder, Produktprodukt) {Boolean ishave = false; // verwendet, um zu markieren, ob es doppelte Einkaufszüge gibt // den aktuellen Einkaufsartikel Sorder soorder = productToSord (Produkt) erhalten; // Beurteilen Sie, ob der aktuelle Einkaufsgegenstand dupliziert ist. Wenn es dupliziert ist, fügen Sie die Menge für (SORDER ALT: FADER.GetSorders ()) {if (old.getproduct (). iShave = wahr; brechen; }} // Der aktuelle Einkaufsartikel gibt es im Einkaufswagen nicht, wenn (! IShave) {// Wir geben hier einen Satz ein: // Vor dem Hinzufügen des Einkaufsartikels zum Einkaufsgegenstand stellen Sie zunächst den Zusammenhang zwischen dem Einkaufsgegenstand und dem Einkaufswagen fest, aber zu diesem Zeitpunkt betreten Forder. Zu diesem Zeitpunkt gibt es den Primärschlüssel Soorder.SetForder (Forder); fderder.getSorders (). add (SORDER); } return forder; } @Override public Sorder ProductToSordo (Produktprodukt) {Sorder soorder = new Sorder (); Soorder.SetName (product.getName ()); Soorder.SetNumber (1); Soorder.SetPrice (product.getPrice ()); Soorder.SetProduct (Produkt); Return SORTER; }}OK, werfen wir einen Blick darauf, zu welcher Aktion, zu der die Bestellung bestätigt wird:
Also gehen wir, um die Logik in der Förderung zu vervollständigen:
@Controller ("fderArction") @Scope ("Prototyp") öffentliche Klasse Forderaction erweitert Basisacction <Fder> {@Override public forder GetModel () {modell = (fder) seision.get ("fder"); Rückkehrmodell; } // Implementieren Sie die kaskadierte Speicherfunktion des Einkaufswagens (Bestellung) und Einkaufsartikel (Steigerung) öffentlicher String Save () {// // Geben Sie die Einkaufsartikel in der Sitzung an das aktuelle Modellobjekt // fder fder = (fder) session.get ("fderer"); // //model.setSIders (fder.getSorders ()); //forder.setAddress (model.getAddress ()); //forder.setName (model.getName ()); //forder.setphone (model.getone ()); //forder.setremark (model.getRemark ()); //forder.setUser((user)session.get("User ")); //forder.setStatus(New Status (1)); //forder.setPost (model.getPost ()); //forder.setPost (model.getPost ()); //forder.setUser((user)session.get("User ")); //forder.setStatus(New Status (1)); //forder.setPost (model.getPost ()); // // kaskadierte Bibliothek (muss in der Annotation von XML oder Pojo konfiguriert werden), sodass der Soorder Association Forder erforderlich ist // // zur SORDERServiceImpl -Klasse.SetForder (FORDER) hinzuzufügen; //ForderService.save(Forder); model.setUser ((Benutzer) Sitzung.get ("Benutzer")); Modell.SetStatus (neuer Status (1)); fderderservice.save (Modell); Rückgabe "Bank"; }} Wie aus dem obigen Code ersichtlich ist, gibt es zwei Methoden: Die erste ist nicht überschreibt die GetModel -Methode (der Teil, den ich kommentierte). Diese Methode ist ziemlich dumm. Da Forderaction die Basisreaktion erbt und Basiswirkung die modelldurchdringliche Schnittstelle implementiert, werden die übergebenen Daten in das Modell eingekapselt. Modell ist eine Eigenschaft in Basisreaktion. Anschließend müssen wir alle Informationen im Modell in der Sitzung an den Forder weitergeben, und dann können die Daten im Forder mit Sorder kaskadieren, um die Bibliothek zu betreten. Diese Methode ist jedoch etwas dumm ... Daher verwenden wir die zweite Methode, schreiben die GetModel-Methode neu und weisen dem Modell den Fder direkt zu. Anschließend müssen wir nur die Kaskadierelemente im Modell hinzufügen, dh den nicht annotierten Code oben. Auf diese Weise werden die Informationen nach der Klicks des Benutzers in die Datenbank eingegeben und zur Zahlungsseite springen (die Zahlungsseite muss als nächstes erfolgen, sodass Sie zuerst zu einem JSP springen können).
2. Page Caching -Probleme
Jetzt wurde der Kaskadeneintrag der Bestellinformationen gelöst. Wenn der Benutzer jedoch klickt, um die Bestellung zu bestätigen, und dann zurück, stellen wir fest, dass es sich immer noch um die ursprüngliche Bestätigungsbestätigungsseite handelt, und die Informationen sind derzeit noch die Informationen, und die Sitzung ist nicht geschlossen, was bedeutet, dass ich die Auftragsinformationen erneut bestätigen muss, was offensichtlich unangemessen ist. Mit anderen Worten, wenn der Benutzer klickt, um die Bestellung zu bestätigen, können wir den Seiten -Cache nicht lassen. Auf diese Weise wird angezeigt, dass die Seite abgelaufen ist, wenn der Benutzer auf die Homepage springen lässt.
Wir wissen, dass die Front-End-JSP-Seite so festgelegt werden kann, dass der Browser keine Daten zwischengespeichert, sodass wir sie wie folgt auf der Seite Front-End bestätigen können.
Aber das Problem ist nicht so einfach. Das ist nur nicht möglich. Wenn Sie dies tun, klickt der Benutzer zurück und fordert, dass die Seite abgelaufen ist. Wenn der Benutzer es jedoch aktualisiert und nicht möglich ist, wird der Cache mit den Originaldaten geladen. Also verstehen wir eine Sache. Da die Sitzung noch nicht geschlossen wurde, gibt es in der Sitzung eine Bestellinformation für den Forder. Benutzer werden diesen Forder auf jeden Fall weiterhin nach dem Auffrischen von und die ursprünglichen Bestellinformationen angezeigt. Daher kann das Einstellen dieses Problems das Problem überhaupt nicht lösen. Wir müssen auch eine relevante Verarbeitung im Hintergrund durchführen.
Da wir das Problem kennen, können wir dies tun: Denn wenn der Benutzer klickt, um die Bestellung zu bestätigen, übergibt es es an die Forderaktion und wird nach dem Verarbeiten der Förderung auf die Zahlungsseite springen. Wir können einige Tricks in der Fderderaktion machen: Wir löschen den ursprünglichen Fderer in der Sitzung, ist das nicht in Ordnung? Dies ist machbar, aber angesichts der Tatsache, dass die Bestellung für die Bestellung bei späteren Zahlungen immer noch relevant ist, können wir den ursprünglichen Forder in der Sitzung an einem anderen Ort speichern und dann den ursprünglichen Forder löschen. Daher fügen wir der obigen Fderderaktion zwei Codezeilen hinzu, wie folgt:
@Controller ("fderArction") @Scope ("Prototyp") öffentliche Klasse Forderaction erweitert Basisacction <Fder> {@Override public forder GetModel () {modell = (fder) seision.get ("fder"); Rückkehrmodell; } // Implementieren Sie die kaskadierte Speicherfunktion des Einkaufswagens (Bestellung) und Einkaufsartikel (Steigerung) öffentlicher String Save () {// // Geben Sie die Einkaufsartikel in der Sitzung an das aktuelle Modellobjekt // fder fder = (fder) session.get ("fderer"); // //model.setSIders (fder.getSorders ()); //forder.setAddress (model.getAddress ()); //forder.setName (model.getName ()); //forder.setphone (model.getone ()); //forder.setremark (model.getRemark ()); //forder.setUser((user)session.get("User ")); //forder.setStatus(New Status (1)); //forder.setPost (model.getPost ()); //forder.setPost (model.getPost ()); //forder.setUser((user)session.get("User ")); //forder.setStatus(New Status (1)); //forder.setPost (model.getPost ()); // // kaskadierter Speicher (muss in der Annotation von XML oder Pojo konfiguriert werden), sodass der Soorder mit Forder zugeordnet ist // // der SORDERServiceImpl -Klasse (FORDER) hinzuzufügen; //ForderService.save(Forder); model.setUser ((Benutzer) Sitzung.get ("Benutzer")); Modell.SetStatus (neuer Status (1)); fderderservice.save (Modell); // Der Einkaufswagen wurde im Speicher gespeichert, sodass der Einkaufswagen in der ursprünglichen Sitzung gelöscht werden sollte. }}Bevor wir fertig sind, müssen wir den folgenden Code hinzufügen, um die Bestellseite auf der Rezeption zu bestätigen:
Die Logik ist jetzt klar. Erstens, wenn die Bestellbestätigungsseite, hat der Forder Daten, so dass es nicht leer ist. Dieses Urteil ist ungültig. Wenn der Benutzer klickt, um die Reihenfolge zu bestätigen, ersetzen wir den Fderer durch ein leeres Forder-Objekt, was bedeutet, dass die ursprünglichen Daten verschwunden sind (wir speichern ihn in einem anderen Schlüsselwertpaar in der Sitzung für die spätere Zahlung). Wenn der Benutzer gerade jetzt zurückklickt und gerade zur Auftragsbestätigungsseite zurückkehrt, wird das Urteil in Kraft gesetzt und zur Startseite springt. Zu diesem Zeitpunkt ist die gesamte Logik vollständig und das Page -Cache -Problem gelöst.
Originaladresse: http://blog.csdn.net/eson_15/article/details/51433247
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.