Bean; aktuellen Benutzerstatus herausfinden

klaus1985

Mitglied
Hallo,
ich bin ziemlich neu im J2EE-Gebiet. Ich bau gerade an einer Anwendung mit JSF.
Ich habe ein Problem, wo ich schon seit Tagen suche, aber keine Lösung finde. Ich habe eine DB, in der Benutzer gespeichert werden (Passwort, Benutzername, Adminstatus (boolean)). Die können sich anmelden, dann wird eine Session erzeugt. Über eine EntityBean kann ich nach dem Einloggen auf den Benutzer zugreifen, das ist ganz praktisch. Wenn sich jetzt allerdings in der Datenbank z.B. der Adminstatus von true auf false ändert, wird immer noch der alte Wert ausgegeben. Auch nach einem Ausloggen und wieder Einloggen ist der Wert immer noch der alte, erst nach einem neuen Deployment hab ich den korrekten Wert.
Die Frage also: wie bekomme ich den aktuellen Wert, der in der DB hinterlegt ist? Hilft da irgendwie eine ManagedBean?

Eine weitere Frage wäre dann, wie ich Benutzerdaten (z.B. über eine Form-Seite) in der Datenbank ändern kann. Brauch ich da SQL-Befehle? Weil wenn ich das über die Bean ändere, ist das zwar für die Session geändert, nach einem neuen Einloggen ist das aber weg...

Vielen Dank schon mal für eure Hilfe.
 
Da du die Benutzer offenbar schon aus der Datenbank über die Beans ausgelesen bekommst, gehe ich mal davon aus, dass du einen objektrelationlaen Mapper (kurz: ORM) wie Eclipselink oder Toplink benutzt.
Damit die Ergebnisse auch wieder in die Datenbank zurückgeschrieben werden, musst du eigentlich nicht mehr machen als das Objekt wieder zu persisiteren:

Code:
EntityManagerFactory emf;
EntityManager em;

emf = Persistence.createEntityManagerFactory(getInitParameter("persitence"));
em = emf.createEntityManager();

em.em.persist(beutzer);

Der Rest wird dir dann sehr komfortabel durch die Bean, den Mapper und den DB-Connector abgenommen.

Auch für den zweiten Teil ist das genauso, du kannst die Daten für das Formular einfach auslesen, das Objekt aktualisieren und es wieder persistieren.

Mit freundlichem Gruß,
Sebastian Apprecht
 
hey,

am Mapper scheints zu fehlen... Ich hab keine Ahnung, woher ich den kriegen soll oder was ich da tun muss (ich werd mal googlen). Ich verwende Netbeans.

Folgender Versuch klappt nicht (DB-Eintrag wird nicht geändert):
Aufruf einer Bean-Methode über eine JSF-Page
Code:
<h:commandLink action="#{usermanager.toggleadmin}" value="toggle" title="toggle" />
Code:
public void toggleadmin() {
        HttpSession session = (HttpSession)
             FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        User user = (User)session.getAttribute("user");

        user.setAdmin(!user.getAdmin());

        EntityManagerFactory emf;
        EntityManager em;

        emf = Persistence.createEntityManagerFactory("meinePU");
        em = emf.createEntityManager();

        em.persist(user);
}


Edit: hab mal probiert
Code:
....
    @Resource
    private UserTransaction utx;

    public void toggleadmin() {
        HttpSession session = (HttpSession)
             FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        User user = (User)session.getAttribute("user");
        user.setAdmin(!user.getAdmin());

        EntityManagerFactory emf;
        EntityManager em;

        emf = Persistence.createEntityManagerFactory("meinePU");
        em = emf.createEntityManager();

        try {
                utx.begin();
                em.persist(user);
                utx.commit();
        } catch (Exception e) { }
    }
allerdings schreibt er mit da jetzt jedes mal einen neuen Benutzer in die Datenbank :-/



zur Vollständigkeit mal meine User-Entity
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author klaus
 */
@Entity
@Table(name = "wuser")
@NamedQueries({
    @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"),
    @NamedQuery(name = "User.findById", query = "SELECT u FROM User u WHERE u.id = :id"),
    @NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username"),
    @NamedQuery(name = "User.findByFirstname", query = "SELECT u FROM User u WHERE u.firstname = :firstname"),
    @NamedQuery(name = "User.findByLastname", query = "SELECT u FROM User u WHERE u.lastname = :lastname"),
    @NamedQuery(name = "User.findByPassword", query = "SELECT u FROM User u WHERE u.password = :password"),
    @NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email"),
    @NamedQuery(name = "User.findByAusbildungId", query = "SELECT u FROM User u WHERE u.ausbildungId = :ausbildungId"),
    @NamedQuery(name = "User.findBySince", query = "SELECT u FROM User u WHERE u.since = :since")})
    
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "username")
    private String username;
    @Basic(optional = false)
    @Column(name = "firstname")
    private String firstname;
    @Basic(optional = false)
    @Column(name = "lastname")
    private String lastname;
    @Basic(optional = false)
    @Column(name = "password")
    private String password;
    @Basic(optional = false)
    @Column(name = "email")
    private String email;
    @Column(name = "ausbildung_id")
    private Integer ausbildungId;
    @Column(name = "active")
    private boolean active;
    @Column(name = "admin")
    private boolean admin;
    @Basic(optional = false)
    @Column(name = "since")
    @Temporal(TemporalType.TIMESTAMP)
    private Date since;

    public User() {
    }

    public User(Integer id) {
        this.id = id;
    }

    public User(Integer id, String username, String firstname, String lastname, String password, String email, Date since) {
        this.id = id;
        this.username = username;
        this.firstname = firstname;
        this.lastname = lastname;
        this.password = password;
        this.email = email;
        this.since = since;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAusbildungId() {
        return ausbildungId;
    }

    public void setAusbildungId(Integer ausbildungId) {
        this.ausbildungId = ausbildungId;
    }

    public boolean getActive() {
        return active;
    }

    public void setAusbildungId(boolean active) {
        this.active = active;
    }

    public boolean getAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

    public boolean isAdmin() {
        return admin;
    }

    public Date getSince() {
        return since;
    }

    public void setSince(Date since) {
        this.since = since;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof User)) {
            return false;
        }
        User other = (User) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "model.User[id=" + id + "]";
    }

}
 
Zuletzt bearbeitet:
Und es werde Licht im Dunkeln ;)
Also wenn ich mich nicht alles täuscht Hibernate mit dem Java Persistence API (JPA). Unter dem Netbeans steckt ein GlassFisch als AppServer (damals hatte der das Oracle TopLink drin heutzutage sollte es auch der EclipseLink sein.). Da das aktuell nicht zu meinen Aufgaben gehört rate ich mal weiter aufgrund deiner Aussage und dem was du geschildert hast:

Das er einen neuen Eintrag macht ist klar - das bewirkt persist (vergleichbar mit einem insert in SQL). Versuche es mal mit "merge" - das sollte automatisch erkennen, ob es ein update oder insert fällig ist.

Ich hoffe ich konnte dir ein wenig weiterhelfen,
Sebastian
 
danke mal so weit. ja, hibernate gibt's, aber das sollte doch auch ohne gehen!?
das mit merge hatte ich auch schon versucht - da wird auch ein neuer eintrag angelegt...
 
Hallo,
also, ich hab's nochmal mit em.merge(user) versucht. Und siehe da - es klappt jetzt plötzlich. Vorher nicht, obwohl ich es neu deployt hatte. Allerdings hab ich doch gelesen, dass em.persist doch auch überschreiben sollte?!

naja, mein Problem ist jetzt noch, dass manuelle Änderungen in der DB nicht gelesen werden, erst, wenn ich die Anwendung neu deploye. Die Session wird aber invalidated, wenn ich mich auslogge. Vielleicht kann mir da noch jemand einen Tipp geben...

achso, ja, EclipseLink verwende ich als ORM....
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück