Uploaded image for project: 'OpenJPA'
  1. OpenJPA
  2. OPENJPA-2551

Standard SQL boolean mapping impossible

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.2.1, 2.2.2, 2.3.0
    • 2.4.0
    • jdbc
    • None
    • Apache Karaf, OSGi, Apache Derby, MySQL, PostgreSQL

    Description

      Currently, it is impossible to have a database table column defined as SQL standard type BOOLEAN (defined in SQL-99) automatically working with a java.lang.Boolean or boolean Java type.

      I am currently testing with:

      1. Apache Derby 10.9
      2. MySQL 5.6
      3. PostgreSQL 9.3


      All three above databases support the column type definition. However, in the case of MySQL, it magically works because the resulting datatype is TINYINT(1), which is "compatible" with the data type bit (expected by current OpenJPA) - which makes it work by accident.

      For the other two databases, I get the following exception:

      <openjpa-2.2.0-rUnversioned directory fatal user error> org.apache.openjpa.persistence.ArgumentException: "org.ancoron.jpa.test.TestEntity.set" declares a column that is not compatible with the expected type "bit".  Column details:
      Full Name: t_test.C_SET
      Type: unknown(16)
      Size: 1
      Default: null
      Not Null: false
      
              at org.apache.openjpa.jdbc.meta.MappingInfo.mergeColumn(MappingInfo.java:775)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.MappingInfo.createColumns(MappingInfo.java:593)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.ValueMappingInfo.getColumns(ValueMappingInfo.java:178)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.strats.HandlerStrategies.map(HandlerStrategies.java:65)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.map(HandlerFieldStrategy.java:82)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMapping.java:895)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:417)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.java:762)[218:org.apache.openjpa:2.2.0]
              at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:651)[218:org.apache.openjpa:2.2.0]
              ... 81 more
      


      Of course, I have applied a workaround using custom Dictionaries, but the main point is that this makes my JPA-only application use implementation-specific configuration, which JPA is supposed to avoid.

      Running with EclipseLink instead of OpenJPA works as expected.

      Attachments

        1. OPENJPA-2551-trunk.patch
          18 kB
          Ancoron Luciferis

        Issue Links

          Activity

            People

              struberg Mark Struberg
              ancoron Ancoron Luciferis
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: