[jboss-user] [JBoss Seam] - Lazy loading behaviour
paul@xfact.nl
do-not-reply at jboss.com
Mon Nov 27 06:01:46 EST 2006
I'm working on a demo-app and walked into some lazy-loading related issues.
I did find a solution, but I would like to find out why the other things I tried didn't work, so I can get a better understanding of things.
The situation is as follows:
| There is a search page, that lists customers.
| Every customer holds a list of messages, which should be lazily loaded.
| The messages are not shown on the search page.
| When clicked on a row, an edit screen is shown, which does show the customer's messages.
|
|
| I use the SeamExtendedManagedPersistencePhaseListener and have a ManagedPersistenceContext configured.
|
| The following code was my first trial, which gives a LazyInitializationException when opening the edit page.
|
| FindCustomerBean
|
| | @Stateful
| | @Name("findCustomer")
| | @Scope(ScopeType.SESSION)
| | public class FindCustomersBean implements FindCustomer{
| | @DataModel("customers")
| | private List<Customer> customers;
| | @DataModelSelection @Out(required=false)
| | private Customer customer;
| | @Logger
| | private Log log;
| | @In(create=true)
| | private EntityManager seamEntityManager;
| |
| | public String edit() {
| | log.debug("Editing customer '" + customer.getName() + "'");
| | return "edit";
| | }
| |
| | @Factory("customers")
| | public void initializeCustomers() {
| | customers = seamEntityManager.createQuery("select c FROM Customer c").getResultList();
| | }
| |
| | @Destroy @Remove
| | public void destoy() {
| |
| | }
| | }
| |
|
| EditCustomerBean
|
| | @Stateful
| | @Name("editCustomer")
| | @Scope(ScopeType.CONVERSATION)
| | public class EditCustomerBean implements EditCustomer {
| | private FindCustomer findCustomer;
| | @In private Customer customer;
| | private String newMessage;
| | @Logger private Log log;
| | @In private EntityManager seamEntityManager;
| |
| | @Create @Begin
| | public void create() {
| | log.debug("Starting customer edit conversation");
| | }
| |
| | public Customer getCustomer() {
| |
| | return customer;
| | }
| |
| | @End
| | public String save() {
| | return "saved";
| | }
| |
| | public void setCustomer(Customer customer) {
| | this.customer = customer;
| | }
| |
| | public String addMessage() {
| | Message message = new Message();
| | message.setMessage(newMessage);
| | message.setDate(new Date());
| | message.setFromTo("To");
| | customer.getMessages().add(message);
| | newMessage = new String();
| | return "addedMessage";
| | }
| |
| | public String getNewMessage() {
| | return newMessage;
| | }
| |
| | public void setNewMessage(String newMessage) {
| | this.newMessage = newMessage;
| | }
| |
| | @Remove @Destroy
| | public void destroy() {
| | log.debug("Destroying customer edit");
| | }
| | }
| |
|
| In the editCustomer.xhtml Facelets page, the list of messsages is displayed in a datatable with value="#{editCustomer.customer.message}".
|
| This doesn't work. From what I understand from the documentation, this is because I started a new conversation. Is this really the reason, or is something else happening?
|
|
|
| The next thing I tried is to add the following line to the @Create method of EditCustomerBean:
|
| | customer = seamEntityManager.merge(customer);
| |
|
| This should re-attach the customer to the session.
| The create method is executed without errors, but it didn't solve the problemm.
|
|
| Now my final solution that did work. I do not understand why this is any different from the example above.
|
| | public Customer getCustomer() {
| | customer = seamEntityManager.merge(customer);
| | return customer;
| | }
| |
|
| I simply moved the same line of code to the getCustomer method.
| The only difference I can think of, is that the getCustomer method is called at a later time.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3988799#3988799
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3988799
More information about the jboss-user
mailing list