OverviewCopy link to clipboard
Tip: This page applies to self-managed installations only. Appian Cloud customers do not need to follow these instructions when upgrading to newer versions of Appian.
The 22.4 release includes an update to the Hibernate object-relational mapping library that requires replacement of specific JPA annotations that are no longer supported: @TableGenerator
, @PrimaryKeyJoinColumn
, @DiscriminatorColumn
, and @DiscriminatorValue
. The instructions on this page cover replacement of the deprecated annotations with supported ones.
Changing @TableGenerator annotationsCopy link to clipboard
CDTs with the @TableGenerator
annotation require changes to both the XML Schema definition (XSD file) of the CDT and the SQL definition of the corresponding table. Use these steps to make the changes:
- Download the XSD of the relevant CDT.
-
Remove the
@TableGenerator
annotation entirely and remove any other references to the table generator. Example:Original XSD:
1 2 3 4 5
<xsd:appinfo source="appian.jpa"> @Id @TableGenerator(name="example_entity", allocationsSize=10, initialValue=100, table="example_entity_table") @GeneratedValue(strategy="TABLE", generator="example_entity") </xsd:appinfo>
CopyModified XSD:
1 2 3 4
<xsd:appinfo source="appian.jpa"> @Id @GeneratedValue </xsd:appinfo>
Copy - Save the XSD.
- From the gear menu inside the CDT designer, select ‘Create New Version from XSD’ and upload the modified XSD.
- Get the definition of the table the CDT corresponds to. (See Retrieve a CDT's corresponding table definition below)
-
Modify the primary key of the table from step #5 to be AUTO_INCREMENT. Example for an integer primary key in MySQL/MariaDB:
1
ALTER TABLE <tableName> MODIFY <primaryKey> INT NOT NULL AUTO_INCREMENT;
Copy - Republish the data store using the CDT. It should verify automatically.
Changing @PrimaryKeyJoinColumn annotationsCopy link to clipboard
@PrimaryKeyJoinColumn
can be a table/entity-level annotation or a column-level annotation. Only column-level occurrences need to be changed. A column-level annotation is preceeded in the logs by the keyword "annotations" instead of the keyword "rawClassAnnotations" used for table/entity-level annotations.
Example table/entity-level annotation that does not need to be changed (notes the "rawClassAnnotations" keyword):
1
{"captureId":"hcuguz","name":"ETB_ECMPositionLite","rawClassAnnotations":" @Table(name\u003d\"ecmposition\") @PrimaryKeyJoinColumn(name\u003d\"ecmposition_position_id\")
Copy
Example column-level annotation that does need to be changed (note the "annotations" keyword):
1
(Array)","annotations":"@OneToMany(cascade\u003dCascadeType.ALL, indexed\u003dfalse) @PrimaryKeyJoinColumn(name\u003d\"requestid\")"}
Copy
CDTs with the @PrimaryKeyJoinColumn
annotation require that you change the XML Schema definition (XSD file) of the CDT. Use these steps to make the change:
- Download the XSD of the relevant CDT.
- Get the definition of the corresponding table. (See Retrieve a CDT's corresponding table definition below)
- Identify the element(s) of the XSD that use @PrimaryKeyJoinColumn and make note of their column name(s) in the table. They should be foreign keys to other tables.
-
Change @PrimaryKeyJoinColumn to @JoinColumn and specify the name to be the column name from step #3.
Consider the following example with 2 related CDTs, order and customer:
Original XSD with 2 CDTs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:com:appian:types:A" targetNamespace="urn:com:appian:types:A"> <xsd:complexType name="order"> <xsd:sequence> <xsd:element name="orderid" nillable="true" type="xsd:int"> <xsd:annotation> <xsd:appinfo source="appian.jpa">@Id</xsd:appinfo> </xsd:annotation> </xsd:element> <xsd:element name="part" nillable="true" type="xsd:string"> <xsd:annotation> <xsd:appinfo source="appian.jpa">@Column(length=255)</xsd:appinfo> </xsd:annotation> </xsd:element> <xsd:element name="customer" nillable="false" type="tns:customer"> <xsd:annotation> <xsd:appinfo source="appian.jpa">@PrimaryKeyJoinColumn(name="customer", referencedColumnName="customerid")</xsd:appinfo> </xsd:annotation> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="customer"> <xsd:sequence> <xsd:element name="customerid" nillable="true" type="xsd:int"> <xsd:annotation> <xsd:appinfo source="appian.jpa">@Id</xsd:appinfo> </xsd:annotation> </xsd:element> <xsd:element name="address" nillable="true" type="xsd:string"> <xsd:annotation> <xsd:appinfo source="appian.jpa">@Column(length=255)</xsd:appinfo> </xsd:annotation> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:schema>
CopyGenerated table defintion for customer:
1 2 3 4 5 6 7 8 9
CREATE TABLE `order` ( `orderid` int(11) NOT NULL, `part` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `customer` int(11) NOT NULL, PRIMARY KEY (`orderid`), UNIQUE KEY `customer` (`customer`), KEY `order_customer` (`customer`), CONSTRAINT `order_customer` FOREIGN KEY (`customer`) REFERENCES `customer` (`customerid`) )
CopyThe remediation is to change:
1
@PrimaryKeyJoinColumn(name="customer", referencedColumnName="customerid")
Copyto
1
@JoinColumn(name="customer")
Copy - Save the XSD.
- From the gear menu inside the CDT designer, select ‘Create New Version from XSD’ and upload the modified XSD.
- Republish the data store using the CDT. It should verify automatically.
Changing @DiscriminatorColumn and @DiscriminatorValue annotationsCopy link to clipboard
The updated Hibernate library no longer requires the @DiscriminatorColumn
and @DiscriminatorValue
annotations, as it now uses internal logic to determine which subclass to query. You need to remove all @DiscriminatorColumn
and @DiscriminatorValue
annotations from the XML Schema definition (XSD file) of the CDT. Use these steps to make the change:
- Download the XSD of the relevant CDT.
-
Remove the
@DiscriminatorColumn
annotation from the superclass. For example:Original XSD of the superclass:
1 2 3 4 5 6
<xsd:appinfo source="appian.jpa"> @Entity @Table(name="Order") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name="OrderTypeCode") </xsd:appinfo>
CopyModified XSD of the superclass:
1 2 3 4 5
<xsd:appinfo source="appian.jpa"> @Entity @Table(name="Order") @Inheritance(strategy = InheritanceType.JOINED) </xsd:appinfo>
Copy -
Remove the
@DiscriminatorValue
annotation from the subclass. For example:Original XSD of the subclass:
1 2 3 4 5
<xsd:appinfo source="appian.jpa"> @Entity @DiscriminatorValue(value="2") @Table(name="InternalOrder") </xsd:appinfo>
CopyModified XSD of the subclass:
1 2 3 4
<xsd:appinfo source="appian.jpa"> @Entity @Table(name="InternalOrder") </xsd:appinfo>
Copy - Save the XSD.
- In the CDT, click the settings menu > Create New Version from XSD.
- Upload the modified XSD.
- Click CREATE NEW VERSION.
Retrieve a CDT's corresponding table definitionCopy link to clipboard
The name of the table that corresponds to a CDT can be determined by reviewing the CDT's XSD file. If the file includes the @Table
annotation, the table’s name is the name specified in the @Table
annotation. Otherwise, the table’s name is the lowercase name of the CDT.
To get the table definition:
- Find the data store using the CDT
- Find the data source of the data store
- From the data source find the relevant connection information: host, port, and schema
-
Connect to the database and retrieve the table definition with
1
SHOW CREATE TABLE <SCHEMA>.<TABLE>;
Copy