This is not an error or bug. the problem is: before your deletion, the entity that is about to be deleted must be in the persistence context. means you must re-attach it if it is not managed
the following lines should do the trick public void deleteMovie(Movie movie){ Movie m = entityManager.find(Movie.class, movie.getId()); entityManager.remove(m); } On Wed, Jan 7, 2009 at 7:02 AM, Jonathan Gallimore < jonathan.gallim...@gmail.com> wrote: > 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 >> >> >> >