It looks like this works if you're using the LocalInitialContextFactory
and looking up a local session bean, but not if you're using
RemoteInitialContextFactory (if you're running against a standalone
server - your test refers to RemoteInitialContextFactory, so I assume
that's what you're trying to do) - presumably because the movie object
passed back to the Movies.deleteMovie() is no longer "attached" in the
bean EntityManager context.
I managed to get your code to work on a standalone server by adding a
private int id field to the Movie entity, along with a getId() and
setId() method (and annotating the setId method with @Id), and changing
the MoviesImpl.deleteMovie() method as follows:
public void deleteMovie(Movie movie) throws Exception {
Query query = entityManager.createQuery("SELECT m from Movie as
m where m.id = ?1");
query.setParameter(1, movie.getId());
Movie retrievedMovie = (Movie) query.getSingleResult();
if (retrievedMovie != null) {
entityManager.remove(retrievedMovie);
entityManager.flush();
}
}
Hope that helps.
Jon
Debarshi Sanyal wrote:
Hi,
I have tried both the suggestions but I couldn't get it right.
However, if I add the movies.remove(movie) call just after
movies.persist(movie); in the same function, i.e. in
MoviesImpl::addMovie(Movie movie), the movie indeed DOES NOT get added
to the DB.
The MoviesImpl.java and MoviesTest.java are attached.
Your help is greatly appreciated.
Regards,
Debarshi
On Sun, Jan 4, 2009 at 10:48 AM, David Blevins <david.blev...@visi.com
<mailto:david.blev...@visi.com>> wrote:
On Jan 2, 2009, at 1:51 AM, Debarshi Sanyal wrote:
Hi All,
New Year greetings!
Happy new year to you too!
I was trying to execute the example on EJB entity-manager
provided at *
http://openejb.apache.org/3.0/injection-of-entitymanager-example.html.*
I have replaced the test case with a standalone client that,
however,
performs exactly the same steps. However, I observed that
while insertion to
the database is occurring perfectly, the deletion does not
take place.
Movies movies = (Movies) context.lookup("MoviesLocal");
movies.addMovie(new Movie("Quentin Tarantino",
"Reservoir Dogs", 1992));
movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
movies.addMovie(new Movie("Joel Coen", "The Big
Lebowski", 1998));
List<Movie> list = movies.getMovies();
assertEquals("List.size()", 3, list.size());
*for (Movie movie : list) {
movies.deleteMovie(movie);
}*
Even after the previous steps, *movies.getMovies().size()*
returns 3 which
is very strange.
That is very strange. I'm not sure what could be happening. When
in doubt add a entityManager.flush() statement and hope for an
error message :) (useful debug tactic with JPA -- just make sure
to remove it in production as it will affect performance) In this
case I'd add it right after the entityManager.remove(movie); call.
Hopefully that will dig up something.
Also double check that one of your modifications did not involve
deleting "PersistenceContextType.EXTENDED" from the example. That
could cause the issue as well -- entityManager.remove(foo) only
works if the object passed in is still "attached" [1].
-David
[1] Attached/Detached explained here
http://openejb.apache.org/3.0/jpa-concepts.html