Hi,

Thank you for the helpful response. I have incorporated the changes and it's
working fine! It is now clear to me that the issue was due to the object
passed from the client to the server not being attached to the bean's entity
manager context.

Thanks a lot!

Regards,
Debarshi



On Wed, Jan 7, 2009 at 9:30 PM, Jazon <reme...@gmail.com> wrote:

> 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
> >>
> >>
> >>
> >
>

Reply via email to