[ 
https://issues.apache.org/jira/browse/DELTASPIKE-319?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

John D. Ament updated DELTASPIKE-319:
-------------------------------------

    Summary: Fail deployment of app with JPA module when EM not found in same 
class.  (was: JPA module fails to start transaction if a qualifier is not used 
under certain conditions)
    
> Fail deployment of app with JPA module when EM not found in same class.
> -----------------------------------------------------------------------
>
>                 Key: DELTASPIKE-319
>                 URL: https://issues.apache.org/jira/browse/DELTASPIKE-319
>             Project: DeltaSpike
>          Issue Type: Bug
>          Components: JPA-Module
>    Affects Versions: 0.3-incubating
>            Reporter: Gabriel Sosa
>            Assignee: John D. Ament
>             Fix For: 0.4-incubating
>
>
> I stumbled upon this by coincidence and it gave me major headaches as it was 
> a bit hard to realize why and where it happened.
> I started using Picketlink 3.0.0.alpha1 and it provides an IdentityManager 
> that handles precisely that. Now the problem is that after looking at 
> Deltaspike's source code for a while, it does the following:
> On a method annotated with @Transactional:
> @Transactional
> public void myTransactionalMethod() {
>     identityManager.createUser("foo");
> }
> As far as I understand, the module needs to know which EntityManager should 
> execute within a transaction, so basically it first scans the annotation 
> (@Transactional) looking for qualifiers, if it finds a qualifier, it performs 
> some checks then starts a transaction. If the annotation does not have a 
> qualifier, then it takes the class that has the @Transactional method, and 
> starts scanning its fields to find the EntityManager used and get its 
> qualifier, if it finds an EntityManager it will take its qualifier. This is 
> expected behaviour but the problem arises when the class calling the 
> transactional method does not have an EntityManager because it doesn't need 
> one. 
> Say in this scenario:
> Public class IdentityManager {
>        protected EntityManager doBlackMagicToGetAnEntityManager() {
>            //find an entitymanager.....
>        }
>        public void createUser(String username) {
>            doBlackMagicToGetAnEntityManager().persist(new User(username));
>        }
> }
> @Named
> @RequestScoped
> public class VictimBean {
>      @Inject
>      IdentityManager identityManager;
>      protected String name;
>      @Transactional
>      public void doCreate() {
>         identityManager.createUser(this.name);
>      }
> }
> Deltaspike will look for a qualifier, won't find it in Transactional. 
> Therefore, it will scan VictimBean looking for a qualifier for an 
> EntityManager, it won't find one, it won't open a transaction, the 
> application throws an exception because createUser(..) modifies the database 
> and is required to be executed within a transaction.
> Is this behavior expected? Because it is very unpredictable. I didn't really 
> see it coming.
> PicketLink requires me to use a @PicketLink qualifier in a field producer so 
> it can get an entity manager but I have this in my Resources bean, which 
> doesn't directly participate in that code.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to