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

JPA Java Discussion :

(debian,eclipse 3.4)detached entity pased to persist


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut (debian,eclipse 3.4)QuerySyntaxException: customer is not mapped
    bonjour,

    j'ai créé un projet eclipse EAR (enterprise application project), auquel j'ai ajouté 3 projets: un JPA (avec des entities), un EJB (avec des EJB) et une clase cliente dans un projet java.

    le problème c'est que le projet EJB ne semble pas reconnaître les entities; à la compilation eclipse ne dit rien (tout semble bon) mais à l'exécution j'ai l'erreur suivante :
    javax.ejb.EJBException: java.lang.IllegalArgumentException: Unknown entity: source.customer.Customer
    .

    voici le code de la classe de l'EJB :
    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 ejb.customer;
     
    import java.util.List;
     
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
     
    import source.Address;
    import source.customer.Customer;
    import source.exception.ValidationException;
    import ejb.customer.CustomerLocal;
     
     
    @Stateless
    		//(name="CustomerSB",mappedName="ejb/stateless/Customer")
    public class CustomerBean implements CustomerLocal, CustomerRemote {
     
    	@PersistenceContext(unitName="petstorePU")
    	private EntityManager em;
     
     
    	public Customer authenticate(String login, String password) {
    		if (login==null || login.equals(""))
    			throw new ValidationException("Invalid login");
     
    		Query query;
    		Customer customer;
    		query=em.createQuery("select c from Customer c where c.login=:login");
    		query.setParameter("login", login);
     
    		customer=(Customer) query.getSingleResult();
    		if (customer!=null)
    			customer.matchPassword(password);
     
    		return customer;	
     
    	}
     
    	public Customer createCustomer(Customer customer, Address homeAddress) {
    		if (customer==null)
    			throw new ValidationException("customer object is null");
    		customer.setHomeAddress(homeAddress);
    		em.persist(customer);
     
    		return customer;
     
    	}
     
    	public Customer findCustomer(Long customerId) {
     
    		if (customerId==null)
    			throw new ValidationException("invalid id");
    		Customer customer;
    		customer=em.find(Customer.class, customerId);
     
    		return customer;
     
    	}
    (...)
    j'ai ajouté des références au projet EJB autant que j'ai pu (dans "properties"/"java build path"/"project", "properties"/"java EE module dependencies"...
    mais rien à faire, à la compilation ça bloque.

    voici le code de la classe JPA :
    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
    package source.customer;
     
    import java.io.Serializable;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
     
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.PostLoad;
    import javax.persistence.PostPersist;
    import javax.persistence.PostUpdate;
    import javax.persistence.PrePersist;
    import javax.persistence.PreUpdate;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.persistence.Transient;
     
    import source.Address;
    import source.exception.ValidationException;
     
    //{|}
    @Entity
    @Table(name="t_customer")
    public class Customer implements Serializable{
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private Long id;
     
    	@Column(unique=true,nullable=false,length=8)
    	private String login;
     
    	@Column(nullable=false,length=8)
    	private String password;
     
    	@Column(nullable=false,length=30)
    	private String firstname;
     
    	@Column(nullable=false,length=30)
    	private String lastname;
     
    	private String telephone;
    	private String email;

    avez-vous une idée?

    olivier.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    j'ai un peu truandé en mettant les entités JPA dans le projet EJB, et maintenant j'ai une autre erreur :

    javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: source_jpa.customer.Customer
    cela concerne la ligne du createCustomer dans le fichier client suivant:

    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
     
    public static void main(String[] args) {
     
    		try {
    			Context ctx=new InitialContext();
     
    //			ejb.customer.CustomerRemote rem=(ejb.customer.CustomerRemote) ctx.lookup("petstore_ear/CustomerBean/remote");
     
    			Object rem0=ctx.lookup("petstore_ear/CustomerBean/remote");
    			ejb.customer.CustomerRemote rem =
    			      (ejb.customer.CustomerRemote) PortableRemoteObject.narrow(rem0,
    			         ejb.customer.CustomerRemote.class);
     
     
    			rem.createCustomer(new Customer(1L,"jambon","rose","jean","bonrause","0018654118","jeanroi@gmail.com",new java.util.Date(1978,02,10),19,null),new source_jpa.Address(1,"4 rue des roses","","METZ","Moselle","57000","FRANCE"));
     
     
    			System.out.println ("--- Hello, clients ---");
    			for (source_jpa.customer.Customer client : rem.findCustomers()) {
    				System.out.println ("client : "+client);
    			}
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}
    j'ai un persistence.xml dans le répertoire META-INF de l'EJB qui est comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <persistence>
    	<persistence-unit name="petstorePU">
    		<jta-data-source>java:/MySqlDS</jta-data-source>
    		<properties>
    			<property name="hibernate.hbm2ddl.auto" value="update"/>
    			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
          		<property name="hibernate.show_sql" value="true"/>
    			<property name="hibernate.connection.password" value="petstorepwd"/>
    			<property name="hibernate.connection.username" value="petstorelg"/> 
    		</properties>
    	</persistence-unit>
    </persistence>
    olivier.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    en général cela signifie que vous utilisez persist() là où vous auriez dû utiliser merge() …

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    merci de votre réponse, je ne vois pas pourquoi je ne peux pas utiliser persist mais je vais essayer de le remplacer pas merge pour voir.

    olivier.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    j'ai trouvé la solution!
    le problème était la valeur de la clé, où je mettais 1L, maintanant en mettant null (et 0 pour l'identifiant de Address) j'arrive à placer ces valeurs dans la base.
    mais... problème : j'obtiens l'erreur suivante:
    --- Hello, clients ---
    javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: customer is not mapped [select c from customer c]
    , je me demande si le problème ne vient pas de la classe customer qui est mappée en tant que table "t_customer", voici quelques bouts de code:

    EJB CustomerBean:
    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
    package ejb.customer;
     
    import java.util.List;
     
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
     
    import source_jpa.Address;
    import source_jpa.customer.Customer;
    import source_jpa.exception.ValidationException;
    import ejb.customer.CustomerLocal;
     
     
    @Stateless
    		//(name="CustomerSB",mappedName="ejb/stateless/Customer")
    public class CustomerBean implements CustomerLocal, CustomerRemote {
     
    	@PersistenceContext(unitName="petstorePU")
    	private EntityManager em;
     
     
    	public Customer authenticate(String login, String password) {
    		if (login==null || login.equals(""))
    			throw new ValidationException("Invalid login");
     
    		Query query;
    		Customer customer;
    		query=em.createQuery("select c from Customer c where c.login=:login");
    		query.setParameter("login", login);
     
    		customer=(Customer) query.getSingleResult();
    		if (customer!=null)
    			customer.matchPassword(password);
     
    		return customer;	
     
    	}
     
    	public Customer createCustomer(Customer customer, Address homeAddress) {
    		if (customer==null)
    			throw new ValidationException("customer object is null");
    		customer.setHomeAddress(homeAddress);
    		em.persist(customer);
     
    		return customer;
     
    	}
     
    	public Customer findCustomer(Long customerId) {
     
    		if (customerId==null)
    			throw new ValidationException("invalid id");
    		Customer customer;
    		customer=em.find(Customer.class, customerId);
     
    		return customer;
     
    	}
    entity Customer;
    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
    package source_jpa.customer;
     
    import java.io.Serializable;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
     
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.PostLoad;
    import javax.persistence.PostPersist;
    import javax.persistence.PostUpdate;
    import javax.persistence.PrePersist;
    import javax.persistence.PreUpdate;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.persistence.Transient;
     
    import source_jpa.Address;
    import source_jpa.exception.ValidationException;
     
    //{|}
    @Entity
    @Table(name="t_customer")
    public class Customer implements Serializable{
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private Long id;
     
    	@Column(unique=true,nullable=false,length=8)
    	private String login;
    olivier.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    j'ai trouvé!!
    il fallait modifier dans l'EJB, au niveau de la méthode findCustomers, la requête JPQL en changeant "customer" par "Customer" (nom de l'entité JPA).

    olivier.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par olivier57b Voir le message
    merci de votre réponse, je ne vois pas pourquoi je ne peux pas utiliser persist mais je vais essayer de le remplacer pas merge pour voir.

    olivier.
    parce que persist() c'est pour des objets non encore persistés (dont l' @id est null…)

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    ce qui est bizarre, c'est que quand l'id est un Long, il faut mettre null pour la classe à persister, et quand l'id est un Integer il faut mettre 0.
    0L convient-il aussi dans le cas d'une clé Long?

    olivier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/03/2012, 17h28
  2. Réponses: 9
    Dernier message: 09/05/2011, 21h25
  3. detached entity passed to persist
    Par snipes dans le forum JPA
    Réponses: 2
    Dernier message: 06/08/2009, 15h19
  4. Réponses: 1
    Dernier message: 14/07/2009, 00h24
  5. [EJB3 Entity] detached entity passed to persist
    Par maysam dans le forum Java EE
    Réponses: 3
    Dernier message: 03/12/2008, 13h43

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