Meaningless Drivel is fun!*
The moose likes EJB Certification (SCBCD/OCPJBCD) and the fly likes Primary Key question Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » EJB Certification (SCBCD/OCPJBCD)
Bookmark "Primary Key question" Watch "Primary Key question" New topic
Author

Primary Key question

Keith Rosenfield
Ranch Hand

Joined: Nov 25, 2003
Posts: 277
Hi All:
In 10.5.3 of the spec it says
The entity object created by the ejbCreate<METHOD> method must have a unique primary
key. This means that the primary key must be different from the primary keys of all the existing
entity objects within the same home. However, it is legal to reuse the primary key of a previously
removed entity object. The container may, but is not required to, throw the DuplicateKeyException
on the Bean Provider´┐Żs attempt to create an entity object with a
duplicate primary key [15] .

What would happen if the primary key was the same as a database entity but not an existing entity object? Wouldn't this also be problematic?
HAPPY NEW YEAR!!!


Keith Rosenfield<br />SCJP<br />SCWCD<br />SCBCD
Tulsi Rai
Ranch Hand

Joined: Jun 26, 2002
Posts: 55
hi keith,
Originally posted by Keith Rosenfield:
Hi All:
In 10.5.3 of the spec it says

What would happen if the primary key was the same as a database entity but not an existing entity object? Wouldn't this also be problematic?
HAPPY NEW YEAR!!!

i am confused here . could you please expand a little bit what do you mean by *same as a database entity but not an existing entity object*?
Happy New year to you too.
Kathy Sierra
Cowgirl and Author
Ranch Hand

Joined: Oct 10, 2002
Posts: 1572
Howdy -- Another good confusing one

The Container makes a distinction between the *entity bean* primary key and the underlying primary key in the database. The reason is that there is really *no* requirement in the spec that the actual THING the entity bean maps to (the *real* entity) is something that even HAS a primary key. So as far as the EJB spec is concerned, the only thing that MUST have a unique primary key is the entity bean itself. That bean might map to something in a database, or even something NOT in a database, and that thing may not even have a primary key of its own (it is up to YOU to figure out how to uniquely represent it in a bean and give the bean its own primary key).
So, DuplicateKeyException is about trying to create an entity bean with a primary key that the Container sees is already in use, assuming the Container can *tell*. Now, your database may be set up in such a way that when you try to do the insert with an existing key, the database itself has a problem, but that is a separate issue.
Remember, in ejbCreate(), the Container has not yet done the insert (for CMP) -- it does the insert *after* ejbCreate(), by looking at what you've set your designated PK field to, and uses that value as the primary key to do the insert. But if the Container can already tell that your PK field value matches an entity that it knows about but which has not been removed, then you can get the DuplicateKeyException.
Also remember that you might have a primary key for your bean that is simply a composite/compound key made up of multiple field values from the *real* entity in the DB... and remember too that the entity bean might be mapped to something that doesn't look anything like a single row in a relational database, even though *most* of the time that is what we're talking about. But the spec doesn't care WHAT you store your real entities in, as long as it is something that can be considered "a persistent store".
cheers,
Kathy
Keith Rosenfield
Ranch Hand

Joined: Nov 25, 2003
Posts: 277
Hi Kathy:
I'm still a bit cloudy on this topic. My understanding of what a primary key is comes from the area of databases(naturally). A primary key is used to ensure that all records of a database table have a unique identity. If an attempt to insert a record in the table having a primary key equal to a record currently in the table the database will complain and will not allow it. I'm not clear on the purpose of the entity bean primary key. At first, I assumed that it did map directly to the primary key of a database table. You made it clear in your last post that this is not the case. Why not? I understand that the container ensures that an entity bean can not be created if is aware of another bean with the same primary key. What purpose does this serve? This fact doesn't seem ensure uniqueness like in a database. What if an there is an entity with the same primary key that the container does not know about? What is to prevent the creation of the entity in this case? Wouldn't this be a problem? How does the container become "aware" of an entity? Is this as the result of a find or create? Is the container "aware" of all the entities of the persistant store?


Please help remove these question marks from my head and put a smile on my face. Like this
Thanks
Serge Adzinets
Ranch Hand

Joined: Nov 26, 2002
Posts: 166
If there is another db record with the same primary key as the one you are trying to create then the primary key violation will occur and the client will get a RemoteException/EJBException while invoking create method of the home object. This is not the problem of the container but yours as long as you manage the primary keys.
Of course, the container does not need to know about all entities in the persistence store. The spec does not require that and it hardly makes sence. SCWCD should know such things


Best Regards,<br />Serge
Keith Rosenfield
Ranch Hand

Joined: Nov 25, 2003
Posts: 277
Hi Siarhei:
I appreciate your reply but my questions still are unanswered. I cleary understand the WHAT. It's the WHY that confuses me. Please re-read my last post and you will see that is the case.
Thanks,
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Primary Key question
 
Similar Threads
Question about composite primary key in JPA.
CMP with out key field in table
DuplicateKeyException question
New Entity with an existing primary key.
EJBObject for new Entity Beans