tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
669
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    klaus1985 klaus1985 ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    19
    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.
     

  2. #2
    Avatar von Sebastian Apprecht
    Sebastian Apprecht Sebastian Apprecht ist offline Direct Websolutions
    Registriert seit
    Feb 2011
    Beiträge
    42
    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 :
    1
    2
    3
    4
    5
    6
    7
    
    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
     
    Direct Websolutions - Ihre IT-Agentur aus dem Märkischen Kreis (Balve, Iserlohn, Menden). Wir bieten Ihnen Webdesign, Hosting und Programmierung.

  3. #3
    klaus1985 klaus1985 ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    19
    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 :
    1
    
    <h:commandLink action="#{usermanager.toggleadmin}" value="toggle" title="toggle" />
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    ....
        @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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    
    /*
     * 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 + "]";
        }
     
    }
    Geändert von klaus1985 (15.02.11 um 00:40 Uhr)
     

  4. #4
    Avatar von Sebastian Apprecht
    Sebastian Apprecht Sebastian Apprecht ist offline Direct Websolutions
    Registriert seit
    Feb 2011
    Beiträge
    42
    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
     
    Direct Websolutions - Ihre IT-Agentur aus dem Märkischen Kreis (Balve, Iserlohn, Menden). Wir bieten Ihnen Webdesign, Hosting und Programmierung.

  5. #5
    klaus1985 klaus1985 ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    19
    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...
     

  6. #6
    klaus1985 klaus1985 ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    19
    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....
    Geändert von klaus1985 (16.02.11 um 19:59 Uhr)
     

Ähnliche Themen

  1. Aktuellen Pfad herausfinden
    Von DirkHo im Forum Java
    Antworten: 2
    Letzter Beitrag: 12.11.09, 13:43
  2. Bean-Variablen als Parameter einer Methode einer anderen Bean
    Von mcdroemmel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 25.06.09, 17:53
  3. Antworten: 5
    Letzter Beitrag: 09.02.09, 12:29
  4. <bean:message>-Tag in <bean:write>-Tag?
    Von klaeuschen41 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 11.04.06, 11:52
  5. Antworten: 2
    Letzter Beitrag: 24.10.05, 03:33