Aktualisieren eine Tabelle mit OnetoMany-Beziehuung

corofighter2

Mitglied
Hallo,

ich habe folg. Problem. Ich habe zwei Relationen in einer Datenbank: User und Auto. Dabei handelt es sich um eine OnetoMany-Beziehung (ein User hat mehrere Autos). Ich habe nun mit dem Nebeans-Wizard eine JSF/JPA-Seite erstellt um diese zu editieren. Falls jmd. dies nicht kennen sollte. Netbeans erstellt folgendes:

- 2 Entities: Auto.java und User.java
- 2 ManagedBeans: UserController und AutoController
- 2 EJB: AutoFacade und Userfacade
- 1 AbstractFacade, die CRUD-Aktionen auf den o.g. Entitäten durchführt.

Natürlich möchte ich nun, dass jeder Nutzer nur seine Auto sehen kann, also habe ich UserController um folg. Methode erweitert:
Java:
public List<Auto> getAuto(){
return this.getFacade().find(this.getSelected().getId()).getAutoList();
}

Die Anzeige funktioniert auch soweit, jedoch wenn ich nun die Datenbank editiere, wird die Seite beim erneuten Laden nicht aktualisiert. Ich habe alles probiert, alle Scopes, alle Cascades, etc, nicht hilft.

Kann jemand helfen, Danke!
 

JimPanse

Bekanntes Mitglied
Hi,

ich würde dein Design nochmal überdenken und eine Bi-direktionale Beziehung erstellen d.h

Java:
@Entity
public class User implements Serializable{

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private List<Auto> autos;
}

public class Auto implements Serializable{

@ManyToOne(fetch = FetchType.LAZY)
private User user;
}

jetzt speicherst du jedes neues Auto direkt mit einer Referenz von dem Benutzer. Die Liste an Autos von einem Benutzer bekommst du einfach über einen join (in diesem Fall fetch join weil die Liste Lazy geladen werden soll)

Java:
from User t where join fetch t.autos where t.id =:userId
oder aus sicht eines Autos

Java:
from Auto t where t.user.id =:userId

Grüße
 

corofighter2

Mitglied
Hallo,

vielen Dank für Deine Hilfe. Es war ja bereits eine bidirektionale Abbildung und mit Deinen SQL-Statements geht es jetzt auch.

Da ich noch recht unerfahren mit JPA bin würde ich trotzdem gerne wissen, weshalb meine obige Lösung nur 1x nach Laden der Seite funktioniert und die find-Methode keine Änderung an der DB mitkriegt. Hier nochmals die find-Methode aus der AbstractFacade:
Java:
public T find(Object id) {
        
        return this.getEntityManager().find(entityClass, id);
    }

Die findAll()-Methode als Beispiel kriegt jede Änderung sofort mit:
Java:
public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }
Nochmals vielen Dank!!!
 

JimPanse

Bekanntes Mitglied
Hi,

ich kenne deinen Code nicht und das Verhalten ist nicht wirklich erklärbar d.h.

1. wird die find-methode() wirklich erneuert aufgerufen?

2. Welchen Scope hat deine ManagedBean? Wenn es SessionScope sein sollte könnte es auch daran liegen das der Aufruf nur ein einziges mal erfolgt.


Grüße
 

corofighter2

Mitglied
Nochmals danke.

zu 1: Ja, habe eine Zähler in die find()-Methode der AbstractFacade eingefügt. Der Aufruf erfolgt also.

zu 2: habe nochmals Session-, View und Request ausprobiert: keine Änderung. Kann es sein, dass die Standardeinstellung der Methode find(Object id) der Klasse EntityManager nur das einmalige Auslesen nach Starten der Applikation vorsieht und dass CRUD-Operationen in neue Listen/Collections durchgeführt werden müssen? Verwende EclipseLink.

Danke
 

JimPanse

Bekanntes Mitglied
zu 1: Ja, habe eine Zähler in die find()-Methode der AbstractFacade eingefügt. Der Aufruf erfolgt also.
Na hoffentlich nicht ;-) Dann könnte man eine Enität nur einmal laden...
zu 2: habe nochmals Session-, View und Request ausprobiert: keine Änderung. Kann es sein, dass die Standardeinstellung der Methode find(Object id) der Klasse EntityManager nur das einmalige Auslesen nach Starten der Applikation vorsieht und dass CRUD-Operationen in neue Listen/Collections durchgeführt werden müssen? Verwende EclipseLink.

Ok. Mit EclipseLink kenne ich mich nicht aus. Ich benutze wenn JPA+Hibernate entweder Plain oder mit EJB3 aber für mich hört es sich danach an dass der EntityManager deine Entität aus einer noch vorhanden Session lädt und nicht aus der Datenbank d.h. entweder mal flush() nach find() aufrufen oder
nochmal in der Doc nach lesen ob man expliziet die Session wieder freigeben muss.

Greetz
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wicket: extends Panel aktualisieren Web Tier 6
P JSF Menüauswahl soll andere Komponente aktualisieren Web Tier 3
A jsf booleanCheckbox aktualisieren Web Tier 6
L Aktualisieren von <h:message> erzwingen? Web Tier 7
S Wie eine Chatprotokoll realisieren? Web Tier 13
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
S JSF Eine XHTML-Datei in zwei andere XHTML integrieren Web Tier 0
V Wie baue ich eine Ajax Webanwendung? Suche Beispielanwendung (UML) eines AJAX Service Web Tier 0
X JSF - eine Liste aller Sessions, Instanzen bzwFacesContexte bekommen? Web Tier 4
M JSP Mit JSP eine SQLite Datenbank editieren? Web Tier 1
P JSF Eine JSF-Applikation in Drupal darstellen - Möglich? Web Tier 5
T JSF Primefaces beim öffnen eines p:dialog wird eine neue View ManagedBean erstellt Web Tier 2
J Was ist denn eine index.jsp seite ? Web Tier 5
M rendered ruft eine Methode auf, andere aber nicht Web Tier 15
M JSP Objekt in eine JavaBean übergeben Web Tier 7
N rich:extendedDataTable hat eine Spalte zuviel Web Tier 4
T Richtige Aussgabe in eine HTML mit JSF Web Tier 2
S Auswahl eine Zeile von einer HTML Tabelle im Servlet Web Tier 4
Scorpi41 RequestDispatcher eine anderes Projekt zugreifen Web Tier 8
C GWT: Eine Variable in allen Widgets Web Tier 6
M JSF: Bei Seitenaufruf eine Methode starten Web Tier 15
I Eine Bean von einer anderen Bean aufrufen Web Tier 2
L Unter JSP eine XML Datei erstellen Web Tier 3
I Export in eine CSV - Datei und PDF Web Tier 5
2 Pro Action nur eine ActionForm? Web Tier 4
H Gibt es für das message-bundle eine Standard - Ordnung? Web Tier 2
B Bei eine eienen Tag auf einen Parent zugreifen. Web Tier 3
S nur eine Message auf Faceskontext ausgeben Web Tier 2
O eine .do-File als welcome-file im web.xml Web Tier 4
T Was nehmen für eine Datenbankapplikation mit Webinterface Web Tier 5
G Eine Instanz pro Managed Bean? Web Tier 2
F Beim Aufruf von einer JSF Seite eine Methode ausführen Web Tier 9
M In einer HTML Tabelle positionieren Web Tier 4
W Tabelle wird nicht aktualisiert Web Tier 8
H Frameset durch Tabelle ersetzten - Probleme mit jsp:include Web Tier 3
S JSP STRUCT Elemente in HTML Tabelle Web Tier 8
M JSF Wiederverwendbare Tabelle Web Tier 3
nrg Dynamische Tabelle Web Tier 4
R Zugriff Validator in Tabelle (ui:repeat) auf andere Felder Web Tier 2
M Problem mit Verlinkung JSP Dynamische Tabelle Web Tier 7
T Daten - DB-Abfrage - Tabelle Web Tier 5
K JSF: Tabelle; Button, Stringausgabe Web Tier 2
N Tabelle dynamisch mit Daten aus Datenbank füllen Web Tier 3
L Dynamische Eingabe-Tabelle mit JSF Web Tier 10
T Tabelle mit checkboxen in Struts Web Tier 19
T Iterate Tabelle mit verschiedenen Hintergründen (Stylesheet) Web Tier 7
F Darstellung einer Tabelle mit JSP Web Tier 4
N JSF-Tabelle erstellen aus Datenbank mittels JDBC Web Tier 12

Ähnliche Java Themen

Neue Themen


Oben