On Jun 2, 2012, at 3:43 PM, georgenis wrote:

> Hi, 
> 
> here is a short preview of my method:
> 
>       @Override
>       public RoleInformation getRole(String roleId, String sessionId) throws
> OpenflowException {
>               Session session = sessionBean.isSessionValid(sessionId);
>               if(session!=null) {     
>                       RoleInformation roleInformation = (RoleInformation)
> entityManager.find(RoleInformation.class, roleId);
>                       if(roleInformation==null)
>                               throw new OpenflowException("Role does not 
> exists >>> "+roleId);
>                       return roleInformation;
>               }
>               return null;
>       }
> 
> The entityManager will be injected by
> @PersistenceContext(unitName="myUnit").

Is the class that declares `getRole` an EJB?  If not then there will be no 
transaction in progress and the `entityManager.find(RoleInformation)` is going 
to return a detached `RoleInformation` instance.  So any data lazily loaded 
will not be loadable inside the `getRole()` method (or outside that method when 
`RoleInformation` is turned into xml).

This is really a lazy loading issue.  The options are to either not use lazy 
loading or to "touch" the lazily loaded fields while the entity is still 
attached to the entityManager.  Probably the second one is preferable.

To do that you need to start a transaction before you execute 
`entityManager.find(RoleInformation.class..)`, the iterate over the collections 
that are lazily loaded, then commit the transaction.

To create a transaction around your `entityManager.find()` call you either need 
to:

 - add `@Resource UserTransaction userTransaction;` to your Web Service class 
then use the `userTransaction` to begin/commit
 - Annotate your web service class with `@Stateless` or `@Singleton`, then 
you'll get the transaction for free.  If you chose `@Singleton` make sure you 
annotate the `getRole()` method with `@Lock(READ)` so that method can be 
multithreaded.


-David


Reply via email to