persistence@glassfish.java.net

RE: Determining if entity has been removed

From: Markus KARG <markus.karg_at_gmx.net>
Date: Mon, 8 Dec 2008 20:33:04 +0100

I see, you want something like the difference between HTTP's result codes
404 NOT FOUND and 410 GONE... I understand.

 

Such an automated support is not possible since RDBMS do not know wheter an
instance had been there before and was deleted, or just have never existed.
JPA is just a layer ontop of an RDBMS, so it cannot know that the instance
was there before and was deleted or never existed at all (unless the JPA
implementation has permanently exclusive access to the entity's mapped
tables, what is most seldomly the case in the real world).

 

From the JPA view what you want seems to be covered by chapter 3.2.4.1
Merging Detached Entity State: "... If X is a removed entity instance, an
IllegalArgumentException will be thrown by the merge operation (or the
transaction commit will fail)....". But I doubt that it will work, because
of what I wrote before: How shall the JPA provider know whether the instance
was deleted by a third party (non-JPA-accessor of the same table)?

 

What you can do to workaround obviously is to distinguish between CREATE and
UPDATE methods in your server interface (in the CRUD sense): If the user
creates a new instance (CREATE) then do em.persist(), it will throw an
exception if the row already exists; if the user wants to edit an existing
(or meanwhile potentially deleted) instance (UPDATE) then do em.find()
before em.merge(), so you will get the wanted NotFoundException. I think
that solves exactly your needs and the interface is rather RESTful... :-)

 

Have Fun

Markus

 

From: Stephen Connolly [mailto:stephen.alan.connolly_at_gmail.com]
Sent: Montag, 8. Dezember 2008 20:02
To: persistence_at_glassfish.dev.java.net
Subject: Re: Determining if entity has been removed

 

Here's one use case off the top of my head

I have a detached entity... and I'm wanting to merge it back... was it
deleted by somebody else while I was working on it (in which case I should
throw and error back to the user about somebody else changing the record)?

By default, currently, merge in such a case will add the entity back in!

2008/12/8 Markus KARG <markus.karg_at_gmx.net>

AFAIK JPA does not contain a means of detection wheter an entity has been
removed, but only whether an instance of an entity is present or not. Also I
do not see a sense in such a detection. What shall it be good for?


> -----Original Message-----
> From: Farrukh Najmi [mailto:farrukh_at_wellfleetsoftware.com]
> Sent: Sonntag, 7. Dezember 2008 23:14
> To: persistence_at_glassfish.dev.java.net
> Subject: Determining if entity has been removed
>
> Dear colleagues,
>
> How can I determine whether an entity has been removed within the
> EntityManager?
> More generally is there any way in the JPA API to determine status of
> an
> entity within
> the EntityManager? It does not appear to be possible. If not possible,
> is this something useful to
> consider for future version of API?
>
> Thanks.
>
> --
> Regards,
> Farrukh Najmi
>
> Web: http://www.wellfleetsoftware.com