"bfo81" wrote :
| Seam Managed Persistence Context
| I must confess that I never ran into LazyInitializationExceptions (abbr.
LIE). I use an Extended Persistence Context in a Conversation scoped Stateful
Session Bean. And when accessing related entities the EntityManager lazily
fetches them without complaint. Don't ask me why. Maybe you can add a case
where the LIE occurs.
|
There is a 'subtle' difference between an extended persistence context (EPC)
and the seam managed persistence context (SMPC).
The EPC allows a conversational component's entity manager to manage the
entities in a 'long running' transaction. The length of the transaction is
usually scoped to the lifespan of the component (typically a stateful session
bean).
Lets assume we have the following entity relationship:
Customer 1 ------ * Address
.. and that the addresses are lazily loaded.
| @Stateful
| public class EditCustomerBean implements EditCustomer {
|
| @PersistenceContext(type=PersistenceContextType.EXTENDED)
| private EntityManager em;
|
| private Customer customer;
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void init(long customerId) {
| customer = em.find(Customer.class, customerId);
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void addAddress(Address address) {
| customer.addAddress(address);
| }
|
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public Customer getCustomer() {
| return customer;
| }
|
| @Remove
| public void end() {
| em.flush();
| }
| }
|
Prior to ejb3 EPM's transactions typically spanned the remote method call (if
your methods were invoked in a JTA tx) - and the Customer object would
therefore become DETACHED at the end of the init() method. Calling
addAddress() would then result in a LIE as the Customer object is not
associated with the current (new) transaction.
The lifespan of the EPC entity manager however is extended and therefore spans
the lifespan of the stateful session bean (sort of). So in the code snippet
above, a client could call init() and then addAddress() without having to rely
on some re-initialisation of the state of the customer on the second call
(usually from some saved state detached state stored in the bean).
Now the important part - Assuming the addresses are lazily loaded - If a
(remote) client calls init() and then getCustomer() and attempts to access the
addresses outside the scope of the entity manager - you will get a LIE whether
the EntityManager is extended or not. This is fairly intuitive - the Customer
object has left the managed environment of the stateful session bean and is no
longer associated with the EPC.
The SMPC takes the concept of an EPC a little further by integrating the JSF
lifecycle with that of the stateful component. Effectively what the SMPC
achieves is the removal of LIE when traversing objects outside the scope of
your session bean (there's more to it than that - but for now that will do).
So in your JSF, if you traversed the customer --> addresses relationship (after
outjecting a customer object) you'll avoid the LIE issue.
For more information on EPC and application transactions see
http://docs.jboss.org/ejb3/app-server/tutorial/index.html
My experience with using an EPC is still somewhat new - and there are a few
gotchas - like marking methods as TX.NOT_SUPPORTED when you don't want to flush
at the end of the method etc - so any corrections/contributions are welcome.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3964409#3964409
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3964409
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user