Hi there,

On 15/06/2008, at 6:00 PM, Robert B.Hanviriyapunt wrote:

Ok. I completely verified that it is a problem (at least for me, who likes to implement inheritance in my entities, big time!)

If you're talking about Vertical Inheritance (i.e., where the parent entity is mapped to a different table) and you have, for example, a toOne mandatory relationship from the parent entity to some other entity, then the foreign key (which is not a class property in the parent entity) must be exposed as a class property in the sub-entity (and allow null in the sub-entity) for the INSERT to work.

-----------------------------
Radar:5219252
EOF fails to generate foreign key in sql (vertical inheritance)
-----------------------------
21-May-2007 08:05 PM Lachlan Deck:
Summary:
EOF is failing to generate the sql binding for foreign keys (i.e., non- class attributes) defined in the parent and flattened to sub-entities (Vertical inheritance) unless you expose the flattened foreign key for the relationship in the sub-entity.

Steps to Reproduce:
1) grab attached model
2) create a new D2W app with the model
3) open the model and generate sql
4) run the app
5) create a company
6) now create an Employee related to above company
7) Message on screen: "Could not save your changes: Object value '2' for column 3 is not an instanceof String"
8) quit
9) Open model again and set flattened foreign key (companyId in Employee) as class attribute.
10) run again. This time it works.

Expected Results:
I expect EOF to generate the foreign keys as it does for any other relationship.

Actual Results:
It's not even producing the foreign key in the sql and is thus attempting to assign a value intended for another column to it - with a JDBC exception being thrown because it naturally was expecting to receive data of a different type.

Regression:
I have tested this extensively over the last 4-5 days on both WO 5.2.4 and WO 5.3.x with the same results. I've tested (as you could see from the mailing list archives under the subject: vertical inheritance) various munging of the model's plist files to no avail. The only work- a-round is expose the flattened foreign key in the sub-entity.

Notes:
The generated sql without exposing the foreign key:
[2007-05-22 11:26:02 EST] <WorkerThread12> === Begin Internal Transaction [2007-05-22 11:26:02 EST] <WorkerThread12> finding primary key value for Person [2007-05-22 11:26:02 EST] <WorkerThread12> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "SELECT PK FROM EO_PK_TABLE WHERE NAME = 'Person' FOR UPDATE">
[2007-05-22 11:26:02 EST] <WorkerThread12> fetch canceled
[2007-05-22 11:26:02 EST] <WorkerThread12> 1 row(s) processed
[2007-05-22 11:26:02 EST] <WorkerThread12> updating primary key value for Person [2007-05-22 11:26:02 EST] <WorkerThread12> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "UPDATE EO_PK_TABLE SET PK = 14 WHERE NAME = 'Person' AND PK = 13"> [2007-05-22 11:26:02 EST] <WorkerThread12> === Commit Internal Transaction [2007-05-22 11:26:02 EST] <WorkerThread12> === Begin Internal Transaction [2007-05-22 11:26:02 EST] <WorkerThread12> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "INSERT INTO Person(id, lastName, code, created, modified, firstName, entityType) VALUES (?, ?, ?, ?, ?, ?, ?)" withBindings: 1:14(NeededByEOF0), 2:"SaveMe"(lastName), 3:2(code), 4:2007-05-22 00:00:00(created), 5:2007-05-22 00:00:00(modified), 6:"Please"(firstName), 7:"Employee"(entityType)> [2007-05-22 11:26:02 EST] <WorkerThread12> === Rollback Internal Transaction

The generated sql when the foreign key is exposed:
[2007-05-22 13:17:20 EST] <WorkerThread4> === Begin Internal Transaction [2007-05-22 13:17:20 EST] <WorkerThread4> finding primary key value for Person [2007-05-22 13:17:20 EST] <WorkerThread4> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "SELECT PK FROM EO_PK_TABLE WHERE NAME = 'Person' FOR UPDATE">
[2007-05-22 13:17:20 EST] <WorkerThread4> fetch canceled
[2007-05-22 13:17:20 EST] <WorkerThread4> 1 row(s) processed
[2007-05-22 13:17:20 EST] <WorkerThread4> updating primary key value for Person [2007-05-22 13:17:20 EST] <WorkerThread4> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "UPDATE EO_PK_TABLE SET PK = 27 WHERE NAME = 'Person' AND PK = 26"> [2007-05-22 13:17:20 EST] <WorkerThread4> === Commit Internal Transaction [2007-05-22 13:17:20 EST] <WorkerThread4> === Begin Internal Transaction [2007-05-22 13:17:20 EST] <WorkerThread4> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "INSERT INTO Person(id, lastName, code, firstName, companyId, modified, created, entityType) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" withBindings: 1:27(NeededByEOF0), 2:"Bob"(lastName), 3:"777777"(code), 4:"Bill"(firstName), 5:2(companyId), 6:2007-05-22 00:00:00(modified), 7:2007-05-22 00:00:00(created), 8:"Employee"(entityType)> [2007-05-22 13:17:20 EST] <WorkerThread4> evaluateExpression: <com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "INSERT INTO Employee(id) VALUES (?)" withBindings: 1:27(id)> [2007-05-22 13:17:20 EST] <WorkerThread4> === Commit Internal Transaction

Please fix/release an update for this soon.

'Inherit3.eomodeld.zip' was successfully uploaded

22-May-2007 07:40 PM Lachlan Deck:
Further to the above, where the work-a-round currently requires exposing the flattened foreign key(s) as class attributes, I've found that the sub-entity must allow-null, regardless of the parent's setting for these attributes, in order for validation (esp in a D2W app) to succeed.

05-Jun-2007 01:50 PM Lachlan Deck:
A further complication comes into play as follows: if you have a parent entity Taggable and one of the sub-entities BinaryInfo that has a Many-to-Many relationship to Taggable via a Join - NeededByEOF0 is not satisfied.
-----------------------------

with regards,
--

Lachlan Deck



_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to