Re: EJB, EntityManager and merging problems
Przemek M. Zawada wrote:
Hello,
I've been looking for nice database I/O way and I've decided to use
(suggested by NetBeans) the EJB.
In fact, I was looking for something, which would speed up my work,
unfortunately I'm stuck for last 4 hours with annoying update database
problem.
Fetching data from database works perfectly. BUT, when I'm trying to
update records, I no changes are made in the database. I wish you'll
help me finding the reason.
As it has been described in many, many google-found pages, I've build an
object, which I use as entity manager. Sample:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class UserManager {
@PersistenceContext(unitName="MyDbPU")
private EntityManager em;
@Resource
SessionContext context;
@EJB
private CupUserFacade userFacade; // Dunno whether it's required?
public int UpdateUser() {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("MyDbPU");
em = emf.createEntityManager();
CupUser user = (CupUser) em.find(CupUser.class, 2);
user.setName("fonk you");
try {
CupUser upUser = em.merge(user);
System.err.println(upUser.getName());
em.close();
return 1;
} catch (Exception ex) {
System.err.println(
"UserManager.UpdateUser(): "
+ ex.getMessage());
return 0;
}
}
@PersistenceContext
public void setEntityManager(EntityManager eman) {
this.em = eman;
}
}
The log file sayz:
FINEST: Execute query ReadObjectQuery(referenceClass=CupUser sql="SELECT
... FROM cup_user WHERE (ID = ?)")
SEVERE: fonk you
FINEST: Merge clone with references entity.CupUser[id=2]
SEVERE: true // is open() EntityManager
FINER: release unit of work
In fact it does not say anything about updating queries...
That's annoying, because I really don't know what am I doing wrong.
Please help. Thank you very much.
Przemek M. Zawada
Hi, Przemek
You've got a bit too much going on here at one. For starters, decide
whether you are going to use @PersistenceUnit *or* @PersistenceContext
*or* Persistence.createEntityManagerFactory().createEntityManager() to
obtain your entity managers. Container-managed will be one of the first
2 choices; application-managed is the third.
I strongly recommend reading
http://download.oracle.com/javaee/6/tutorial/doc/bnbqw.html.
As an aside, note that inside a transactional boundary em.find() will
returned a managed entity - there is no need to then merge it. Again, I
recommend that you read the above link; however, depending on your
scenario either the container will take care of transactions for you
(with container-managed EMs), or you will, by either using the
EntityTransaction or UserTransaction APIs. In this case you had an
application-managed EM but no transaction...hence no update.
AHS
--
Give a man a fish, and he can eat for a day. But teach a man how to
fish, and he'll be dead of mercury poisoning inside of three years.
--Charles Haas