Richard Zowalla created OPENJPA-3018:
----------------------------------------
Summary: Size appended to a JSON or JSONB column definition on
PostgreSQL, MySQL and MariaDB
Key: OPENJPA-3018
URL: https://issues.apache.org/jira/browse/OPENJPA-3018
Project: OpenJPA
Issue Type: Bug
Affects Versions: 4.1.1
Reporter: Richard Zowalla
A column declared with {{columnDefinition}} (or {{column-definition}} in a
mapping file) of type {{jsonb}} on PostgreSQL, or {{json}} on MySQL and
MariaDB, gets the column length appended in the generated DDL. For a {{String}}
column the default length is 255, so the schema tool emits {{jsonb(255)}} and
the database rejects the statement:
{noformat}
org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: type modifier is not
allowed for type "jsonb"
CREATE TABLE AnyObject (id VARCHAR(36) NOT NULL, ..., plainAttrs jsonb(255),
...)
{noformat}
{{DBDictionary.getTypeName(Column)}} passes the column definition through
{{appendSize()}}, which appends the size unless the type name is in
{{fixedSizeTypeNameSet}}. {{PostgresDictionary}} does not list {{JSON}} or
{{JSONB}}, and {{MySQLDictionary}} and {{MariaDBDictionary}} do not list
{{JSON}}. None of these types takes a length.
Reported on PR #220 by Francesco Chicchiriccò while testing Apache Syncope
master against 4.2.0-SNAPSHOT, with this mapping:
{code:xml}
<basic name="plainAttrs">
<column column-definition="jsonb"/>
</basic>
{code}
Syncope 3.x did not hit this because its mapping also declared {{<lob/>}},
which sets the size to -1.
Workaround: {{openjpa.jdbc.DBDictionary=postgres(FixedSizeTypeNames=JSONB)}}.
Fix: add {{JSON}} and {{JSONB}} to the fixed size type names of
{{PostgresDictionary}}, and {{JSON}} to those of {{MySQLDictionary}} and
{{MariaDBDictionary}}.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)