You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
Seam solves the problem of LazyInitializationExceptions (LIE) for Conversations using a Seam Managed Persistence Context (SMPC). Seam's EntityHomes make it trivial to solve this problem for longer scopes - SESSION, APPLICATION and BUSINESS_PROCESS.
@Name("currentUserHome")
public class CurentUserHome extends EntityHome<User> {
@Out(scope=ScopeType.SESSION, required=false)
@In(required=false)
private Integer currentUserId;
@Factory(value="currentUser")
public User getCurrentUser() {
return getInstance();
}
@Override
protected User createInstance() {
if (currentUserId != null) {
return getEntityManager().find(User.class, currentUserId);
} else {
return new User();
}
}
}
Then, to set the current user
, just outject currentUserId into SESSION scope.
Well, if you simply annotate your entity with @Name and @Scope, then, when loaded (using a SMPC) and outjected, it is stored in the desired context. BUT, if you then leave the conversation in which it was loaded, you will get an LIE if you access a property which was not initialised inside that conversation. Ouch.
So, instead of storing the entity in a scope longer than Conversation, we store the id of the entity in the long running scope and the entity in the conversation. Using a @Factory we initialise the entity context variable. If the id is null a new entity is created, otherwise a fresh copy of the entity is loaded and attached to this conversation.