Hi,

This is my EM producer:

        @PersistenceContext(unitName = "pu")
        private EntityManager entityManager;

        @ApplicationScoped
        @Produces
        public EntityManager getEntityManager() {
                return entityManager;
        }


I don't have a @Disposes method because I am using container-managed 
persistence and it results in errors complainig that I should not close the 
container-managed EM manually. Am I wrong in having it application-scoped?

I have a src/main/resources/META-INF/apache-deltaspike.properties file with 
this:

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy=org.apache.deltaspike.jpa.impl.transaction.ContainerManagedTransactionStrategy

And I see this in the log:
 INFO  [org.apache.deltaspike.core.impl.exclude.extension.ExcludeExtension] 
(MSC service thread 1-2) 
org.apache.deltaspike.jpa.impl.transaction.ContainerManagedTransactionStrategy 
is configured as global-alternative

This is what I understood to be required in my case. Should I use 
BeanManagedUserTransactionStrategy instead? What is the difference?

Anything else I should check?

Lucian

________________________________________
From: Gerhard Petracek <gpetra...@apache.org>
Sent: Thursday, 7 May, 2020 11:58 AM
To: users@deltaspike.apache.org
Subject: Re: TransactionRequiredException when a transaction should exist

hi lucian,

please ensure that you are using the correct setup for ee-servers
(esp. see [1] and [2]).

regards,
gerhard

[1] 
http://deltaspike.apache.org/documentation/data.html#3.CompleteAdditionalProjectConfiguration
[2] http://deltaspike.apache.org/documentation/jpa.html#JTASupport



Am Mo., 4. Mai 2020 um 22:24 Uhr schrieb Lucian BRANCOVEAN
<lucian.brancov...@indsoft.ro>:
>
> Hi,
>
> I am using Deltaspike 1.9.3 in Wildfly 14.
>
> I have a CDI bean with a method that is supposed to insert or update an 
> entity, like this:
>
> @Named
> @ApplicationScoped
> public class StuffService {
>
>     @Inject
>     private StuffRepository repository; // StuffRepository extends 
> EntityRepository<Stuff, Long>
>
> ...
>
>     @Transactional
>     public void save(Stuff stuff) throws Exception {
>
>         if (stuff.getCode() == null) {
>             repository.save(stuff);
>
>         } else {
>
>             Stuff entity = getByCode(stuff.getCode()); // code is @Id
>             entity.setName(stuff.getName());
>             repository.save(entity);
>         }
>     }
>
> This works, but looking at the EntityRepository.save javadoc, I understand 
> that it already does what I want, decide if to update or insert a new record 
> based on the presence/absence of a primary key value.
>
> However, if I call repository.save() on an existing entity (so I remove the 
> if and always go in the first branch), I get an exception:
>
> javax.persistence.TransactionRequiredException: WFLYJPA0060: Transaction is 
> required to perform this operation (either use a transaction or extended 
> persistence context)
>     at 
> org.jboss.as.jpa@14.0.1.Final//org.jboss.as.jpa.container.AbstractEntityManager.transactionIsRequired(AbstractEntityManager.java:877)
>     at 
> org.jboss.as.jpa@14.0.1.Final//org.jboss.as.jpa.container.AbstractEntityManager.merge(AbstractEntityManager.java:564)
>
> What happens here? How come a transaction does not exist unless I create a 
> new object and transfer the data into it?
>
> What I guess might be relevant is that the Stuff entity comes from a 
> ViewScoped bean, from a previous request.
>
> Note, I am using container-managed transactions, and 
> javax.transaction.Transactional. Should I use 
> org.apache.deltaspike.jpa.api.transaction.Transactional? What is the 
> difference?
>
> Thanks in advance,
>
> Lucian
>
>
>

Reply via email to