Hi all,
Sometimes you just need to share things that bite you. I have been having problems with objectWithPrimaryKeyValue.
Here's what I was calling:
EOUtilities.objectWithPrimaryKeyValue(ec, ENTITY_NAME, Long.valueOf(0))
When it runs, I get:
10:48:59 MyApp[9003] DEBUG NSLog - evaluateExpression: <com.webobjects.jdbcadaptor.EROracleExpression: "SELECT t0.CODE, t0.DESCRIPTION FROM STATUSCODE t0 WHERE t0.CODE = ?" withBindings: 1:0(id)> 10:48:59 MyApp[9003] DEBUG NSLog - 1 row(s) processed 10:48:59 MyApp[9003] DEBUG NSLog - === Commit Internal Transaction 10:48:59 MyApp[9003] WARN NSLog - <com.webobjects.appserver._private.WOComponentRequestHandler>: Exception occurred while handling request: com.webobjects.eoaccess.EOUtilities$MoreThanOneException: Selected more than one item for primary key {id = 0; } in entity SamsStatusCode.
The CODE in the DB is the PK, and I've executed the SQL and it returns exactly one row, just like you'd expect and the NSLog statement above says, yet I'm getting the more than one item for PK error.
Steve Meyer came up with the answer: Just because you are getting on SQL row back, doesn't mean that it doesn't represent more than one EO.
This Entity/Table is part of a Single Table Inheritance structure, and there are two oddities about the restricting qualifiers:
1) They are on the Primary Key column. For example: "id = 0 or id = 30 or id = 31" 2) They define _ranges_ as well as individual values. For example: "id > 1799 and id < 1810"
This seems to work just fine, except when we have one Entity that has no restricting qualifier, so when you call EOUtilities.objectWithPrimaryKeyValue(ec, ENTITY_NAME, Long.valueOf(0)) you get two EOs back. Because two different Entities' restricting qualifier match "id = 0" .
Happy Monday.
Dave |