[EJB3 + JbossWS] Transaction probleem Webservice

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20-09 11:06
Beste Programmeergrootheden,

Voor een project ben ik bezig met me te orienteren in Webservices icm EJB3.
De bedoeling is een soort PhotoGallery te maken in Flex die communceert met een Java/EJB3 Webservice met daarachter een MySQL database.
Het grootste gedeelte werkt allemaal al prima. Ik kan prima foto's uitlezen vanuit de database (via een blob veld) en enumereren door alle foto's in flex gaat ook prima.

Het probleem is nu alleen dat als ik in de webservice een update of delte query uit wil voeren, ik transactie errors krijg. Ik heb gezocht, en er word overal gezegd dat dit komt omdat normaal gesproken SEAM (of Spring) deze transacties start. Maar ik kan nergens vinden hoe ik dit zelf kan doen ( of transacties uit kan zetten, want die heb ik helemaal niet nodig).

De webservice:

Java:
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
package services;

import java.util.List;

import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;

import entities.GalleryImage;

@Stateless
@WebService
@TransactionManagement()
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class GalleryService implements GalleryServiceRemote {
    @PersistenceContext(unitName = "GalleryService")
    private EntityManager entityManager;

    @Resource
    private EJBContext context;

    @WebMethod
    @SuppressWarnings("unchecked")
    public List<GalleryImage> listGalleryImages() {
        return entityManager.createQuery("FROM GalleryImage gi")
                .getResultList();
    }

    @WebMethod
    public void addGalleryImage(String description, byte[] image) {
        GalleryImage img = new GalleryImage();
        img.image = image;
        img.description = description;
        entityManager.persist(img);
    }

    @WebMethod
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void deleteGalleryImage(long id) {
        List<GalleryImage> imageList = listGalleryImages();
        System.out.println("MEUUUH");
        for (GalleryImage image : imageList) {
            if (image.id == id) {
                entityManager.getTransaction().begin();
                entityManager.remove(image);
                entityManager.getTransaction().commit();
                return;
            }
        }

    }

    @WebMethod
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void editGalleryImage(long id, String description, byte[] image) {
        try {
            List<GalleryImage> imageList = listGalleryImages();
            for (GalleryImage img : imageList) {
                if (img.id == id) {
                    img.description = description;
                    img.image = image;

                    System.out.println("Found, and edited...");
                    UserTransaction tx = context.getUserTransaction();
                    tx.begin();
                    entityManager.persist(img);
                    tx.commit();
                    return;
                }
            }
        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}


De foutmelding (1 van de vele verschillende):

code:
1
12:33:30,488 WARN  [AbstractEntityManagerImpl] Calling joinTransaction() on a non JTA EntityManager


De foutmelding hierboven wisselt nog wel eens met de verschillende implementaties van de Transactions.
Er word ook wel eens gezegd dat de transaction niet gestart is (wat komt als ik niets met transactions doe)

In alle gevallen word er niets geupdate of gedelete.
Wie weet er raad?

- Thijs

Even niets...


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Als je geen transacties nodig hebt kan je gewoon alle regels code die daarmee te maken hebben weglaten. Je businessfuncties zijn atomair dus dat is geen probleem. Ik weet niet waarom je die UserTransaction zaken uberhaupt hebt toegevoegd?

Als je "@TransactionAttribute(TransactionAttributeType.SUPPORTS)" gebruikt hoeft de call niet in een transactionele context plaats te vinden, maar krijg je wel de voordelen van rollbacks als je ooit een caller schrijft die wel ingewikkelde dingen gaat doen.

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20-09 11:06
Klopt, heb je gelijk in, maar als ik een Update statement uitvoer zegt Java ineens wel dat ik een transaction nodig heb... Ik moet dus een manier vinden om 'ergens' transactions keihard uit te zetten...

Even niets...


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Komt dat niet omdat je in editGalleryImage persist() gebruikt i.p.v. merge()? :)

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20-09 11:06
nope,

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
23:19:46,967 WARN  [AbstractEntityManagerImpl] Calling joinTransaction() on a non JTA EntityManager
23:19:47,241 INFO  [STDOUT] Hibernate: 
    select
        galleryima0_.id as id0_,
        galleryima0_.description as descript2_0_,
        galleryima0_.image as image0_ 
    from
        GalleryImage galleryima0_
23:19:54,189 INFO  [STDOUT] Hibernate: 
    select
        galleryima0_.id as id0_,
        galleryima0_.description as descript2_0_,
        galleryima0_.image as image0_ 
    from
        GalleryImage galleryima0_
23:19:54,227 ERROR [STDERR] javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
23:19:54,227 ERROR [STDERR]     at org.jboss.ejb3.entity.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:150)

Even niets...


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Lees de docs eens over de transactions bij je applicatie server. Waarschijnlijk moet je in je hibernate of jpa config transactions aanzetten. Dan hoef je in je code helemaal niets met transactions te doen omdat de default een nieuwe transactie start als die er niet is.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20-09 11:06
Iemand een id?

Even niets...

Pagina: 1