Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 22h04   #1
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
Par défaut Java EE 6 exception persistance

Bonjour, je m'essaye à Java EE 6 et j'ai l'erreur suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
exception
 
javax.servlet.ServletException: javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
cause mère
 
javax.faces.el.EvaluationException: javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	javax.faces.component.UICommand.broadcast(UICommand.java:315)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)

j'ai cette erreur lorsque j'essaye d'enregistrer en base un widget créer, voici mon code:


Widget.java
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
package knowledge.tuto1;
 
import java.io.Serializable;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
 
@Entity
public class Widget implements Serializable
{
   private Long id;
   private String partNumber;
   private String name;
   private String description;
 
   @Id
   @GeneratedValue
   public Long getId()
   {
      return id;
   }
 
   public void setId(Long id)
   {
      this.id = id;
   }
 
   // demonstrates a column name override
   @Column(name = "partno")
   public String getPartNumber()
   {
      return partNumber;
   }
 
   public void setPartNumber(String partNumber)
   {
      this.partNumber = partNumber;
   }
 
   public String getName()
   {
      return name;
   }
 
   public void setName(String name)
   {
      this.name = name;
   }
 
   public String getDescription()
   {
      return description;
   }
 
   public void setDescription(String description)
   {
      this.description = description;
   }
 
   /** Default value included to remove warning.  Remove or modify at will.  */  
   private static final long serialVersionUID = 1L;
}
Mon controleur.java
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
 
package knowledge.tuto1;
 
import javax.annotation.PostConstruct;
import javax.ejb.TransactionManagement;
import javax.enterprise.inject.Model;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
 
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
 
public @Model class Controleur {
	private Widget widget;
	private final String text = "";
 
	private String letters;
 
	private String numbers;
 
	private String email;
 
	@Inject
	@WidgetRepository
	EntityManager widgetRepository;
 
	public Controleur() {
	}
 
	@PostConstruct
	public void initialize() {
		widget = new Widget();
		System.out
				.println(this.getClass().getSimpleName() + " was constructed");
	}
 
	public String getText() {
		return text;
	}
 
	public Widget getWidget() {
		return widget;
	}
 
	public void setWidget() {
		widgetRepository.persist(widget);
	}
 
}


et mon fichier xhtml
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
 
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   template="/WEB-INF/templates/default.xhtml">
   <ui:define name="content">
      <h1>Hello World!</h1>
      <p>Your CDI bean <code>HelloWorld</code> says <span style="color: blue;">#{controleur.text}</span> using the Unified EL.</p>
 
      <h:form id="bv">
         <h2>Bean Validation examples</h2>
         <p>Enforces annotation-based constraints defined on the model class.</p>
         <table>
            <tr>
               <th style="text-align: right;">
                  <h:outputLabel for="part" value="Partner:"/>
               </th>
               <td>
                  <h:inputText id="part" value="#{controleur.widget.partNumber}"/>
                  <h:message for="part" errorClass="invalid"/>
               </td>
            </tr>
            <tr>
               <th style="text-align: right;">
                  <h:outputLabel for="name" value="Name:"/>
               </th>
               <td>
                  <h:inputText id="name" value="#{controleur.widget.name}"/>
                  <h:message for="name" errorClass="invalid"/>
               </td>
            </tr>
            <tr>
               <th style="text-align: right;">
                  <h:outputLabel for="desc" value="Description:"/>
               </th>
               <td>
                  <h:inputText id="desc" value="#{controleur.widget.description}"/>
                  <h:message for="desc" errorClass="invalid"/>
               </td>
            </tr>
         </table>
         <p>
            <h:commandButton id="check" action="#{controleur.setWidget()}" value="Check values"/>
            <h:outputText value=" All clear!" rendered="#{facesContext.postback and empty facesContext.messageList}" style="color: green;"/>
         </p>
      </h:form>
      <h2>Widgets</h2>
      <h:dataTable var="_widget" value="#{widgets}">
         <h:column>
         <f:facet name="header">Id</f:facet>
            #{_widget.id}
         </h:column>
         <h:column>
            <f:facet name="header">Part Number</f:facet>
            #{_widget.partNumber}
         </h:column>
         <h:column>
            <f:facet name="header">Name</f:facet>
            #{_widget.name}
         </h:column>
         <h:column>
            <f:facet name="header">Description</f:facet>
            #{_widget.description}
         </h:column>
      </h:dataTable>
   </ui:define>
</ui:composition>

erreur lors de l'appel à la methode setWidget()

merci beaucoup.
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 08h49   #2
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
Peux-tu montrer le persistence.xml ?
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 09h18   #3
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
voila:
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
 
<?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="widgets">
      <!-- You can force a non-default JPA provider using one of these declarations -->
      <!--
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
      -->
 
      <!-- Use this data source name for JBoss AS -->
      <jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
      <!-- Use this data source name for Glassfish -->
      <!--
      <jta-data-source>jdbc/__default</jta-data-source>
      -->
      <properties>
         <!-- Properties for Hibernate (default provider for JBoss AS) -->
         <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
         <property name="hibernate.show_sql" value="true"/>
         <property name="hibernate.transaction.flush_before_completion" value="true"/>
         <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
 
         <!-- Properties for EclipseLink (default provider for GlassFish) -->
         <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
         <property name="eclipselink.logging.level" value="FINE"/>
 
      </properties>
   </persistence-unit>
</persistence>
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 09h22   #4
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
je sauvegarde widget en base de données:
Code :
1
2
3
4
5
6
7
8
 
CREATE TABLE IF NOT EXISTS `widget` (
  `id` bigint(20) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `partno` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h27   #5
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
la ligne est incomplète
Code :
1
2
<persistence-unit name="..." transaction-type="JTA">
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 12h46   #6
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
Merci de votre réponse, pourquoi doit on utiliser transaction-type="JTA"?
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h42   #7
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
On n'est pas obligé d'utiliser JTA, on peut également mettre RESOURCE_LOCAL, mais s'il faut des transactions, il faut le préciser
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h07   #8
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
Merci beaucoup pour votre aide
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h14   #9
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
J'ai malheureusement toujours le même problème...
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h39   #10
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
j'ai lu sur un autre forum que Glassfish nécessitait JTA, je ne pourrais pas l'affirmer, je n'utilise pas Glassfish et en plus j'utilise JTA...
ce qui m'étonne dans le code que tu montres c'est l'injection de l'EntityManager,
Code :
1
2
3
4
 
@Inject 
@WidgetRepository 
EntityManager widgetRepository;
on utilise d'habitude
Code :
1
2
3
 
@PersistenceContext(unitName="Habilis3MetierPU")
protected EntityManager entityManager;
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h50   #11
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
je n'utilise pas glassfish, j'utilise Jboss AS7
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h51   #12
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
j'utilise
Code :
1
2
3
4
 
@Inject 
@WidgetRepository 
EntityManager widgetRepository;
pour pouvoir faire mon persist...
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h52   #13
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
oups, je me suis emmêlé les crayons... désolé
pourquoi @inject ?
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h53   #14
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
pas de soucis, d'après ce que j'ai pu lire ici et la, le @inject me permet d'avoir une référence à mon EntityManager dans ma classe non?
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h00   #15
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
J'ai la meme exception avec
Code :
1
2
3
 
	@PersistenceContext(unitName="widgets")
	EntityManager widgetRepository;
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h17   #16
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
J'ai oublié de mettre mes fichiers WidgetRepository et WidgetRepositoryProducer
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package knowledge.tuto1;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
 
@Qualifier
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface WidgetRepository {}

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package knowledge.tuto1;
 
import javax.ejb.Stateless;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.Disposes;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
 
@Stateless
public class WidgetRepositoryProducer
{
   // NOTE cannot use producer field because Weld attempts to close EntityManager
   @PersistenceContext EntityManager em;
 
   public @Produces @WidgetRepository EntityManager retrieveEntityManager() {
      return em;
   }
 
   public void disposeEntityManager(@Disposes @WidgetRepository EntityManager em) {}
}
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h35   #17
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
Peut etre que ca serait mieux que je parte d'un tuto comme celui la:
http://miageprojet2.unice.fr/index.php?title=Programme_des_enseignements/Applications_Web/TP7_Applications_web_:_utilisation_d'une_base_de_donn%C3%A9es

mais j'utilise Eclipse et pas netbean, et il y a plein de chose que je ne trouve pas
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 16h11   #18
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
je crois que ce serait mieux de faire un truc simple... tu confonds un peu tout...

Pour faire une synthèse, l'entity est manipulé via un entity manager dans un ejb (stateless ou stateful).
cet ejb est utilisé dans ta servlet via une interface remote (le plus souvent)

pour référencer un ejb, on utilise l'annotation @EJB ou du JNDI
pour l'entity manager, on utilise @PersistenceContext
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2012, 17h20   #19
Membre confirmé
 
Avatar de Khaled.Noordin
 
Homme Khaled Ibn Noordin
Inscription : janvier 2005
Messages : 185
Détails du profil
Informations personnelles :
Nom : Homme Khaled Ibn Noordin
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 185
Points : 218
Points : 218
@Inject n'inject pas tout partout, en particulier les EntityManager en font partis, sauf si tu crée une extension d'annotation de @PersistenteContext de type producer, donc pas de traitement faveur
Code java :
1
2
    @PersistenceContext
    private EntityManager entityManager;

comme je vois que tu utilise CDI oublie pas de mettre un fichier beans.xml même vide dans ton web-inf


Il est possible d'injecter un ejb sur une interface cela demande de fournir une annotation de qualifier sur l’implémentation pour créer un crochet en la reportant a coté du @Inject, mais si tu débute vas y pas a pas avant d'ajouter de la complexité et concentre toi sur @EJB.
__________________
Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément. Nicolas Boileau
Khaled.Noordin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2012, 17h55   #20
Invité régulier
 
Inscription : septembre 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 62
Points : 6
Points : 6
Merci pour votre réponse, j'ai fait un beans.xml. J'ai un autre problème en fait je pense que j'ai une persitence unit pour chacun de mes jar et donc les entités creer ne sont pas les mêmes,comment gérer un seul pu par ear?
szambaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h45.


 
 
 
 
Partenaires

Hébergement Web