Issue Details (XML | Word | Printable)

Key: OPENJPA-177
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Daniel Gajdos
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
OpenJPA

When using NOT NULL constraint on foreign key it is not possible to use CascadeType.ALL and GeneratedId

Created: 21/Mar/07 11:19 AM   Updated: 31/Jul/07 07:53 PM
Return to search
Component/s: jpa
Affects Version/s: 0.9.6
Fix Version/s: 1.0.0

Time Tracking:
Not Specified

Environment: Windows XP, IBM 32-bit SDK 5.0, WebSphere 6.1
Issue Links:
Reference
 

Resolution Date: 31/Jul/07 07:53 PM


 Description  « Hide
When using on entity Application
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "C_PERSON_ID", nullable=false)
@ForeignKey
private Person person;
and on entity Person using generated ID, it fails on inserting Application because of performing db actions in this order:
INSERT INTO T_APPLICATION (C_ID, C_APPLICATION_NUMBER, C_APPLIED_DATE, C_STATUS) VALUES (:1, :2, :3, :4) - here it tries to insert null value as C_PERSON_ID, which is not permited because of nullable=false declaration. This declaration creates NOT NULL constraint on C_PERSON_ID.
INSERT INTO NSVISP.T_PERSON (C_ID, C_BIRTH_DATE, C_FIRST_NAME, C_LAST_NAME) VALUES (:1, :2, :3, :4)
UPDATE NSVISP.T_APPLICATION SET C_PERSON_ID = :1 WHERE C_ID = :2
Error reported from DB:
org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-01400: cannot insert NULL into ("T_APPLICATION"."C_PERSON_ID")

Is there any chance to change the order in which this operations are executed? On this type of constraint we have to insert Person before inserting Application and include the generated Person Id into insert statement for Application. Otherwise we have to deffer the NOT NULL constraint which can be dangerous and it is not defered initialy.

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Abe White added a comment - 21/Mar/07 04:15 PM
OpenJPA will insert records in the order that you persist the corresponding objects. When you persist in an order that would violate foreign key constraints, OpenJPA attempts to insert null and then update the foreign key value in a separate statement. If you use non-nullable constraints, though, you must persist your objects in the correct order.

Daniel Gajdos added a comment - 22/Mar/07 09:15 AM
In official manual for OpenJPA, chapter 13.2. Schema Factory (http://people.apache.org/~mprudhom/openjpa/site/openjpa-project/manual/ref_guide_schema_info.html#ref_guide_schema_info_factory) I found:
When using this factory, it is important that your mapping metadata correctly represent your database's foreign key constraints so that OpenJPA can order its SQL statements to meet them.
And my question is how is OpenJPA ordering it;s statements when as you can see it is inserting Application first and then Person and it takes care about @ForeignKey constraint by inserting null value in Application and then updating this value to PersonID. Is it true that OpenJPA doesn't take care about non-nullable constraints? Another interesting thing is that after changing nullable to false it does not change the DB schema by adding not null constraint, it adds this constraint only when creating TABLE. Is this correct?

Reece Garrett made changes - 04/May/07 06:29 PM
Field Original Value New Value
Link This issue relates to OPENJPA-235 [ OPENJPA-235 ]
Markus Fuchs added a comment - 11/Jul/07 11:25 PM
Daniel,

I submitted a patch for OPENJPA-235 that prevents nullifying not-nullable columns. The patch is openjpa-235-break-nullable.patch. Would you be able to test it or provide a test case for me? Thanks!

Markus Fuchs added a comment - 31/Jul/07 07:34 PM
This problem should be solved by openjpa-235-break-nullable.patch, which has been checked in.

Craig Russell added a comment - 31/Jul/07 07:53 PM
The fix for OPENJPA-235 should resolve this issue as well.

If any problems remain, please reopen this JIRA.

Craig Russell made changes - 31/Jul/07 07:53 PM
Resolution Fixed [ 1 ]
Fix Version/s 1.0.0 [ 12312341 ]
Status Open [ 1 ] Resolved [ 5 ]