IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Persistance qui ne persiste pas ?


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut Persistance qui ne persiste pas ?
    Bonjour,

    Je me décide enfin à venir appeler à l'aide, je suis très jeune dans l'univers J2EE, et je rencontre un problème qui me bloque depuis quelques jours, concernant la mise à un jour d'un entity bean.

    Je vous liste l'état des choses :
    La création d'un objet et l'appel à persist() de l'entity manager enregistre bien l'état de l'objet dans la table.
    La récuperation par une NamedQuery fonctionne et me retourne bien l'objet que je souhaite modifier.
    La modification de son état par les setters n'est jamais répercuté dans la base de données.
    Tout comme la suppression d'un objet par remove sur l'entity manager.

    Je ne sais vraiment plus d'ou cela peut venir, j'ai testé auparavant sur Geronimo, et maintenant sur Glassfish, et le même problème se rencontre.

    L'erreur devrait se trouver à mon avis dans la classe Entity ou dans le bean session qui y accède, je vous offre les deux en cette heure, si vous l'acceptez bien.

    entity.Account
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package entity;
     
    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
     
    @NamedQueries({
    	@NamedQuery(name="checkLogin",query="SELECT a FROM Account a WHERE a.login=:login AND a.password=:password")
    })
    @Entity
    public class Account implements Serializable {
     
        private Long id;
        private String login;
        private String password;
        private double balance;
     
        public Account(){}
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public Long getId() {
            return id;
        }
     
        public String getLogin() {
            return this.login;
        }
     
        public void setLogin(String login) {
            this.login = login;
        }
     
        public String getPassword() {
            return this.password;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public void setBalance(double balance) {
            this.balance = balance;
        }
     
        public double getBalance() {
            return this.balance;
        }
     
     
        public void setId(Long id) {
            this.id = id;
        }
     
        @Override
        public String toString() {
            return "entity.Account[id=" + id + ";user=" + this.login + ";" + this.balance + "$]";
        }
     
    }
    session.AccountBean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package session;
     
    import entity.Account;
    import javax.ejb.Stateful;
    import javax.persistence.EntityManager;
    import javax.persistence.NoResultException;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    import javax.ejb.EJB;
     
    @Stateful
    public class AccountBean implements AccountRemote, java.io.Serializable {
     
        private Account account;
     
        @PersistenceContext(unitName="ShopPU")
        private EntityManager em;
     
        public void createAccount(String user, String pass, double deposit) {
            Account account  = new Account();
            account.setLogin(user);
            account.setPassword(pass);
            account.setBalance(deposit);
            this.em.persist(account);
        }
     
        public boolean loadAccount(String user, String pass) {
            Query query = this.em.createNamedQuery("checkLogin");
            query.setParameter("login", "user");
            query.setParameter("password", "pass");
            try {
                this.account = (Account) query.getSingleResult();
            } catch (NoResultException e) {
                return false;
            }
            return true;
        }
     
        public void deposit(double amount) {
    		if (this.account != null){
    			double balance = this.account.getBalance() + amount;
    			this.account.setBalance(balance);
    		}
    	}
     
    	public double getBalance() {
    		if (this.account != null)
    			return this.account.getBalance();
    		return 0.;
    	}
     
    	public double withdraw(double amount) {
    		if (this.account == null)
    			return 0.;
    		double balance = this.account.getBalance() - amount;
    		this.account.setBalance(balance);
    		return this.account.getBalance();
    	}
     
    }
    Et mon fichier persistence.xml, au cas ou.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
      <persistence-unit name="ShopPU" transaction-type="JTA">
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <jta-data-source>jdbc/sample</jta-data-source>
        <properties>
          <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
      </persistence-unit>
    </persistence>
    Voila, si vous aviez un maigre temps à consacrer à ce sujet, je serais ravi de voir un peu plus de lumière sur ce nouveau monde qu'est J2EE pour moi.

    Bonne soirée (:

  2. #2
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Par défaut
    Fais voir la classe qui appelle tes EJBs.

    Tu persistes bien les modifications ?

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut
    Alors, j'injecte le bean à partir d'une servlet, TestAccountBean.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package servlet;
     
    import java.io.IOException;
     
    import javax.ejb.EJB;
    import javax.servlet.*;
    import javax.servlet.http.*;
     
    import session.AccountLocal;
     
    /**
     *
     * @author ipingu
     */
    public class TestAccountBean extends HttpServlet {
     
    	@EJB
    	private AccountLocal account;
     
    	@Override
    	protected void service(HttpServletRequest arg0, HttpServletResponse response)
    			throws ServletException, IOException {
     
            if (!account.loadAccount("user", "pass")){
                response.getWriter().write("Account cannot be loaded. Trying to create one. ");
                account.createAccount("user","pass",100.);
                if (!account.loadAccount("user", "pass")){
                    response.getWriter().write("Definitely can not create an account.");
                    return;
                }
                response.getWriter().write(account.toString());
            }
    		response.getWriter().write("Balance : " + account.getBalance());
    		account.deposit(42.);
            response.getWriter().write(account.toString());
    		response.getWriter().write("Balance after a withdraw of 42 bucks : " + account.getBalance());
        }
    }
    Mon test crée l'objet dans la BD, et la modif de l'état n'est toujours pas répercuté dans la BD.
    J'ai essayé de voir avec les fonctions merge() sur l'entitymanager, mais cela ne me sauve pas pour autant.
    Ajout de l'annotation @TransactionManagement(value=TransactionManagementType.CONTAINER) dans AccountBean, mais cela ne change pas non plus l'histoire...

    Merci !

  4. #4
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Par défaut
    Récupère une instance d'EntityTransaction et persiste ton AccountBean après l'appel des méthodes deposit(...) / withdraw(...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    EntityManager em = null;
    em = Persistence.createEntityManagerFactory("ShopPU").createEntityManager(); 
     EntityTransaction t = em.getTransaction();
    t.begin();
    // ...
    // Ton traitement ici ...
    // ...
    em.persist(account);
    t.commit();
    em.close();
    Quand tu utilises des entities en dehors d'un container J2EE (c'est le cas dans ta servlet), tu dois récupérer une instance de EntityTransaction pour manager les transactions.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/05/2015, 10h54
  2. [2.x] Session qui ne persiste pas via appels AJAX
    Par hebus44 dans le forum Symfony
    Réponses: 6
    Dernier message: 13/06/2013, 14h37
  3. Afficher couleur et infos au survol qui reste persistant après avoir survolé l'élément
    Par majo59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/06/2011, 11h56
  4. [PHP 5.3] [POO] Objet persistant qui perd la valeur de ces attributs
    Par Michel Rotta dans le forum Langage
    Réponses: 20
    Dernier message: 22/04/2011, 01h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo