[
https://issues.apache.org/jira/browse/DELTASPIKE-319?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13600490#comment-13600490
]
Gabriel Sosa commented on DELTASPIKE-319:
-----------------------------------------
I know you can do that, but it's my humble opinion that this is still something
that needs to be addressed at least by throwing an exception saying "We can't
find an EntityManager qualifier, please provide one", because as it is today,
it is really obscure, it doesn't throw any sort of warning, I spent hours
debugging to know what the problem is. Sometimes using other frameworks
obscures their use of an entity manager, or you may not know its qualifier.
When a user adds @Transactional on a method, he expects two things, either it
executes in a transaction, or it throws an exception, but here it just silently
carries on. Please consider treating this as a bug, it may spare others a
significant amount of time, since it leads you to uncertainty as to what is
wrong, first you suspect the method is not being intercepted, then try it on
other classes, etc, which is quite a bad experience.
> JPA module fails to start transaction if a qualifier is not used under
> certain conditions
> -----------------------------------------------------------------------------------------
>
> 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
> Fix For: 0.3-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