Using existing ejb3 entity beans in seam
renspr May 11, 2006 7:31 AMHi,
I would like to know how to use existing ejb3 entity beans in seam as a seam component? Lets assume the following scenario:
I have a simple ejb3 package deployed in JBoss, which provides a persistent context (unitName = "openep") and a simple entity bean named User. Lets call this package PACKAGE_A.
The User entity in PACKAGE_A has no @Name and @Scope annotations, so it is not a seam component. For the User entity in PACKAGE_A I don't want to have any dependencies to seam. It is just a plain entity bean.
In a second package (PACKAGE_B), which is actually a seam application packaged as an ear, I want to use the existing entity bean from PACKAGE_A as a seam component. My application in PACKAGE_B is basically equivalent to the seam registration example except that I want to use my existing User entity from PACKAGE_A.
My naive approach to make this existing User entity a seam component was to create a SeamUser class, which extends the existing User entity from PACKAGE_A.
@Name("user") @Scope(SESSION) public class SeamUser extends User { private static final long serialVersionUID = -6805341268455291354L; }
My registration action in PACKAGE_B looks like this:
@Stateless @Name("register") public class RegisterAction implements Register { @In @Valid private SeamUser user; @PersistenceContext(unitName = "openep") private EntityManager em; @IfInvalid(outcome = Outcome.REDISPLAY) public String register() { em.persist(user); return "success"; } }
The deployment of PACKAGE_B works but when I try to register a new user I will get a
javax.ejb.EJBException: java.lang.IllegalArgumentException: Unknown entity: com.openep.registration.SeamUser
exception when calling em.persist(user). I tried to cast SeamUser to User but this leads to the same exception.
... em.persist((User)user); ...
The following code works and does exacly what I want, but I like to know if there is a more elegant way to do it?
@Stateless @Name("register") public class RegisterAction implements Register { @In @Valid private SeamUser user; @PersistenceContext(unitName = "openep") private EntityManager em; @IfInvalid(outcome = Outcome.REDISPLAY) public String register() { User myUser = new User(user.getUsername(), user.getPassword()); em.persist(myUser); return "success"; } }
I hope that someone can give me a hint.
Best regards, René