2017-10-15 2 views
0

Nehmen wir ein einfaches Jsf-Beispiel mit einer xhtml-Seite, einem ManagedBean, einem Service und einer JPA-entityClass an. Ich habe eine Menge von usecases mit folgenden Struktur:Wie man die Entität nach dem Speichern von Änderungen in der verwalteten Bean auf dem neuesten Stand hält

  • ein Unternehmen hält in meiner Bohne
  • Sie Aktionen auf der Einheit

Einiges einfaches Beispiel Darstellung auf der aktualisierten Einheit Do, so wird jeder

Entity verstehen:

public class Entity { 
    private long id; 
    private boolean value; 
    ... 
    // Getter and Setter 
} 

Dao:

public class EntityService { 

    // Entity Manger em and other stuff 

    public void enableEntity(long id) { 
     Entity e = em.find(id); 
     e.value = true; 
     em.persist(e); 
    } 
} 

Managed Bean:

@ManagedBean 
@RequestScoped/ViewScoped 
public class EntityBean() { 

    @EJB 
    private EntityService entityService; 

    private Entity entity; 

    @PostConstruct 
    public void init() { 
     // here i fetch the data, to provide it for the getters and setters 
     entity = entityService.fetchEntity(); 
    } 

    public void enableEntity() { 
     entityService.enableEntity(entity.getId); 
    } 

    // Getter and Setter 
} 

und schließlich ein einfaches xhtml:

<html> 
    // bla bla bla 

    <h:panelGroup id="parent"> 
     <h:panelGroup id="disabled" rendered="#{not EntityBean.entity.value}> 
       <p:commandButton value="action" action="#{EntityBean.enableEntity}" update="parent" /> 
     </h:panelGroup> 

     <h:panelGroup id="enabled" rendered="#{EntityBean.entity.value}> 
       // other stuff that should become visible 
     </h:panelGroup>    
    </h:panelGroup> 
</html> 

Was ich erreichen möchte:

  • Zeigen Sie immer die aktuelle Entität in jeder Anfrage an!

Was ich schon versucht

  • ich mit einem versuchten dao-Fetch in meinem Getter. Aber man kann überall lesen, dass dies eine schlechte Übung ist, weil Jsf den Getter mehr als einmal aufrufen wird (aber im Moment kann ich sie nur auf dem neuesten Stand halten).
  • Ich versuchte RequestScoped Bohnen. Die Bean wird jedoch vor der Ausführung der Aktion erstellt und beim Update-Aufruf nicht neu erstellt. Der Wert wird veraltet sein (sinnvoll, da es sich um eine Anforderung handelt und die Anforderung mit dem Klick auf die Schaltfläche beginnt).
  • Ich versuchte ViewScoped Beans und fügte einen leeren String-Rückgabewert zu meiner Methode hinzu. Meine Hoffnung war, dass diese Umleitung das Bean nach der Verarbeitung der Aktion neu erstellen wird. Aber das war nicht der Fall.
  • Ich habe versucht, die Refetch-Funktion nach jeder verwendeten Methode manuell aufzurufen. Aber ich habe einige Cross-Bean-Aktionen für dieselbe Entity (Meine realen Entitäten sind viel komplexer als dieses Beispiel). So wissen die verschiedenen Bohnen nicht immer, ob und wann sich das Wesen verändert hat.

Meine Fragen:

  • Kann dies mit jeder Art von Scope getan werden? Nehmen wir an, dass jede Anfrage die Daten von meinem PostConstruct wieder holt.
  • Es muss

Dies scheint eine bessere Lösung als die dao-Fetch in der Getter-Methode sein, ein grundsätzliches Problem für mich zu sein, denn bisher Daten, die die oben bekommen für meine Anwendung wesentlich ist (Daten geändert häufig).

Mit Primefaces 6.1 und Wildfly 10.x

+0

Welches ORM-Tool verwenden Sie? – Kaizen

+0

JPA-Entitäten und Hibernate zum Speichern in MySQL-Datenbank – kaiser

Antwort

1

Was denken Sie darüber? Eine Anfrage-Bean, die ebenfalls für die Aktualisierung erstellt wird und nur eine fetchEntity() pro Anfrage ausführt.

<f:metadata> 
    <f:viewAction action="#{entityBean.load()}" onPostback="true"/> 
</f:metadata> 

@ManagedBean 
@RequestScoped 
public class EntityBean() { 

    @EJB 
    private EntityService entityService; 

    private Entity entity = null; 

    public void load() {} 
    public Entity getEntity() { 
    if(entity == null) { 
     entity = entityService.fetchEntity(); 
    } 
    return entity; 
    } 
    public void enableEntity() { 
    entityService.enableEntity(getEntity().getId); 
    } 

    // Getter and Setter 
} 
+0

Ich verwende anstelle von f: viewAction, weil mein Hauptinhalt in einer ui: composition liegt und ich daher kein f: metadata tag benötige. Aber das scheint ziemlich gut zu sein. Ich habe eine geringe Seitenlast und die Daten sind aktuell. Vielen Dank ^^ – kaiser

Verwandte Themen