Hi Abe, Just to be clear, it is the BizB table that has the FK, and the BizA class that has the one-to-many relationship.
Whether the issue that I'm raising is a bug, an enhancement request, or a no-problem depends on what one expects to be able to accomplish by customizing a FullClassStrategy and assigning it as the class strategy for BizB with the OpenJPA Strategy annotation. So far as I can tell, if one has BizB and BizA annotated to work with OpenJPA's support for an inverse-key mapping, and then one attempts to just alter the insertion SQL for the BizB class (without touching the domain model or the BizA mapping), one will find out that there is no way to do this with a custom FullClassStrategy for BizB. Is this a problem? I think so. Assume one want to use stored procedures to replace all of the SQL that OpenJPA generates for a class. For this to happen, there must be one place where the SQL being generated to insert a BizB object can be overriden by the user. The obvious place to override the insertion SQL would be the customInsert method of the FullClassStrategy, but so far as I can tell, the two parameters passed into this method do not have the information required, even if the one-to-many relationship in BizA had a custom field mapping as you suggest. It's possible that I'm stumbling around in the dark. If so, it would be great if you could shine a light on the issue. Thanks, David Abe White (JIRA) wrote: > [ > https://issues.apache.org/jira/browse/OPENJPA-236?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12494086 > ] > > Abe White commented on OPENJPA-236: > ----------------------------------- > > One-way inverse-key-based relations are not a typical case, given that they > aren't even supported in standard JPA. You might need to use a custom field > mapping in conjunction with the custom class mapping. > >> No apparent way to generate all required SQL within a class derived from >> FullClassStrategy >> ------------------------------------------------------------------------------------------ >> >> Key: OPENJPA-236 >> URL: https://issues.apache.org/jira/browse/OPENJPA-236 >> Project: OpenJPA >> Issue Type: Bug >> Components: kernel >> Affects Versions: 0.9.7 >> Reporter: David Ezzio >> Attachments: OpenJPABugCustomSQL.zip >> >> >> FullClassStrategy has several optional methods for overriding OpenJPA's >> generation of SQL. However, in a simple case, there is no apparent way to >> generate the required SQL within a class derived from FullClassStrategy. >> The model consists of two classes, BizA which has a one-way, one-to-many >> relationship to BizB. The relationship is mapped with an inverse key within >> the BizB table. >> The custom class strategy BizBMapping attempts to insert a BizB record and >> is able to do so, provided that it is not contained within a BizA >> collection. Otherwise, the attempt to persist a BizA with a contained BizB >> yields a SQL exception because OpenJPA generates additional SQL that >> conflicts with the SQL generated within BizBMapping.customInsert. Even if >> OpenJPA did not generate conflicting insert statement, there is no apparent >> way to get the value for the A_ID column within the BizBMapping.customInsert >> method. >> This issue is critical for users who want to substitute their own SQL (such >> as calls to stored procedures) for all of the OpenJPA generated SQL. >> Synopsis of the output log: >> INSERT INTO BIZB (ID, INFO) VALUES (?, ?) [params=(String) B22047141, >> (String) random] >> INSERT INTO BizA (id, info) VALUES (?, ?) [params=(String) A32968849, >> (String) random] >> INSERT INTO BizB (A_ID) VALUES (?) [params=(String) A32968849] >> SQLException: Column 'ID' cannot accept a NULL value. > Notice: This email message, together with any attachments, may contain information of BEA Systems, Inc., its subsidiaries and affiliated entities, that may be confidential, proprietary, copyrighted and/or legally privileged, and is intended solely for the use of the individual or entity named in this message. If you are not the intended recipient, and have received this message in error, please immediately return this by email and then delete it.