Heath Thomann created OPENJPA-2627:
--------------------------------------

             Summary: Create an option to disable column type checking during 
schema validation.
                 Key: OPENJPA-2627
                 URL: https://issues.apache.org/jira/browse/OPENJPA-2627
             Project: OpenJPA
          Issue Type: Improvement
          Components: usability
    Affects Versions: 2.2.3, 2.4.1
            Reporter: Heath Thomann
            Assignee: Heath Thomann
            Priority: Trivial


I have a customer scenario (as I'll describe in a moment) that requires them to 
set the following property:

<property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>


When I have the customer set this property, OpenJPA throws this exception:

 org.apache.openjpa.persistence.ArgumentException:
"com.xxx.yyy.Parent.phone" declares a column that is not
compatible with the expected type "varchar".  Column details:
Full Name: Parent.phone
Type: varbinary


In other words, the customer's column for 'phone' is defined as varbinary in 
their SQL Server database.  This type seems to be specific to SQL Server.  The 
JPA entity defines 'phone' as a String.  Therefore, from OpenJPA's point of 
view, this is a mismatch.  The customer only sees this when the above property 
is set, without this property OpenJPA doesn't do the schema validation as such 
this goes unchecked and all works fine.  While OpenJPA views this as a mismatch 
and doesn't allow them to go on, the JDBC driver and database allows the String 
to be stored into an SQL Server varbinary.

The scenario under which they are required to set the SchemaFactory is the 
typical SQL miss ordering that can occur when OpenJPA doesn't know about a FK 
constraint.  That is, they have an FK constraint in the database between, as an 
example, a Child to Parent.  OpenJPA doesn't know about this FK constraint.  
Given this, when the customer persists a new Parent and Child, sometimes 
OpenJPA inserts the Child first, which yield an FK Constraint Violation 
exception.  This is nothing new and OpenJPA, and the SchemaFactory property was 
created to handle this scenario.  It allows OpenJPA to view the database table 
schema, and in so doing OpenJPA can detect (learn about) the FK constraint 
which will allow it to properly order SQL statements.

As you can see, we are in a bind here: the customer can not change their column 
type, and OpenJPA will not go on given this column mismatch.  I have seen other 
cases where the use of SchemaFactory causes exceptions from column type 
checking that otherwise go unchecked and work fine when the property is not 
set.  Given this, we need to allow a customer a way (property) to disable the 
column type checking.  Note that I realize another option for this particular 
scenario is to use @ForeignKey.  However, this requires a customer to change 
their code and is OpenJPA specific.  Therefore the customer is not willing to 
use this.

Thanks,

Heath



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to