You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 41 Next »

The goal of this document is to show implications for tosca model template to move from Eclipse-Link to Hibernate. Primary focus is to show the database compatibility and eventually schema changes where is necessary.
In all these tests I am using some strategies to make sure that tables and fields name generated by Hibernate will be the same as Eclipse-Link.

Definitions

  • ElementCollection: Specifies a collection of instances of a basic type or embeddable class. Must be specified if the collection is to be mapped by means of a collection table.
  • OneToMany: Specifies a many-valued association with one-to-many multiplicity. If the collection is defined using generics to specify the element type, the associated target entity type need not be specified; otherwise the target entity class must be specified. If the relationship is bidirectional, the mappedBy element must be used to specify the relationship field or property of the entity that is the owner of the relationship. The OneToMany annotation may be used within an embeddable class contained within an entity class to specify a relationship to a collection of entities. If the relationship is bidirectional, the mappedBy element must be used to specify the relationship field or property of the entity that is the owner of the relationship. When the collection is a java.util.Map, the cascade element and the orphanRemoval element apply to the map value.

Persistence classes scanning

Control Loop runtime uses persistence.xml file: is the deployment descriptor file for persistence using JPA. It specifies the persistence units and declares the managed persistence classes, the object/relation mapping, and the database connection details.

Hibernate

SpringBoot auto-configuration can automatically scan entity classes. In Control Loop Runtime we can use @EntityScan annotation because entity classes are not placed in the main application package or its sub-packages. In this situation, we need declare the package or list of packages in the main configuration class within @EntityScan annotation.

Application.java
.............................
@EntityScan({"org.onap.policy.models.tosca.simple.concepts",
    "org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Implications using Hibernate and SpringBoot scan

persistence.xml file doesn't contain all JPA classes in "org.onap.policy.models.tosca.simple.concepts" package, so SpringBoot will intercept additional classes (not defined into persistence.xml file) and will generate additional tables into controlloop database for them: ToscaEventFilter, ToscaModel, ToscaServiceTemplates, ToscaServiceTemplates_ToscaServiceTemplate, ToscaTimeInterval, ToscaTrigger.


Schema generation


Boolean and TimeStamp

In the most of the cases, in tosca model template there is compatibility in field types. Only two types (java.util.Date and Boolean) are not compatible between Eclipse-Link and Hibernate.

JpaExample
@Embeddable
@Data
public class ExampleKey implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "name", length = 120)
    private String name;

    @Column(name = "version", length = 20)
    private String version;
}

@Entity
@Table(name = "Example")
@Data
public class JpaExample implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @Column
    private Boolean primed;

    @Column(name = "timeStamp", precision = 3)
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
    private Date timeStamp;
}

Eclipse-Link

MariaDB [controlloop]> describe Example;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| PRIMED    | tinyint(1)   | YES  |     | 0       |       |
| timeStamp | datetime(3)  | YES  |     | NULL    |       |
| name      | varchar(120) | NO   | PRI | NULL    |       |
| version   | varchar(20)  | NO   | PRI | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Hibernate

MariaDB [controlloop]> describe Example;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| name      | varchar(120) | NO   | PRI | NULL    |       |
| version   | varchar(20)  | NO   | PRI | NULL    |       |
| primed    | bit(1)       | YES  |     | NULL    |       |
| timeStamp | datetime(6)  | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Boolean and TimeStamp (fixed)

columnDefinition will override the sql DDL generated by hibernate for this particular column, but it is non portable.

JpaExample
@Entity
@Table(name = "Example")
@Data
public class JpaExample implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @Column(columnDefinition ="tinyint(1)")
    private Boolean primed;

    @Column(name = "timeStamp", precision = 3, columnDefinition = "datetime(3)")
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
    private Date timeStamp;
}

Eclipse-Link

MariaDB [controlloop]> describe Example;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| PRIMED    | tinyint(1)   | YES  |     | NULL    |       |
| timeStamp | datetime(3)  | YES  |     | NULL    |       |
| name      | varchar(120) | NO   | PRI | NULL    |       |
| version   | varchar(20)  | NO   | PRI | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Hibernate

MariaDB [controlloop]> describe Example;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| name      | varchar(120) | NO   | PRI | NULL    |       |
| version   | varchar(20)  | NO   | PRI | NULL    |       |
| primed    | tinyint(1)   | YES  |     | NULL    |       |
| timeStamp | datetime(3)  | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Map and List of Strings

When @ElementCollection is used properly there is enough compatibility. We can see that in the scenario shown below: there is only a small difference in how the primary keys are build.

JpaExampleCollection
@Entity
@Table(name = "ExampleCollection")
@Data
public class JpaExampleCollection implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    @Lob
    private Map<@NotNull String, @NotNull String> attributes;

    @ElementCollection
    private List<String> occurrences;
}


Eclipse-Link

MariaDB [controlloop]> describe ExampleCollection;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleCollection_ATTRIBUTES;
+---------------------------------+---------------------------------------------------------------------------------------------------+
| Table                           | Create Table                                                                                      |
+---------------------------------+---------------------------------------------------------------------------------------------------+
| JpaExampleCollection_ATTRIBUTES | CREATE TABLE `JpaExampleCollection_ATTRIBUTES` (
`name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  `ATTRIBUTES` longtext DEFAULT NULL,
  `ATTRIBUTES_KEY` varchar(255) DEFAULT NULL,
  KEY `FK_JpaExampleCollection_ATTRIBUTES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleCollection_ATTRIBUTES_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleCollection` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+---------------------------------+---------------------------------------------------------------------------------------------------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleCollection_OCCURRENCES;
+----------------------------------+--------------------------------------------------------------------------------------------------+
| Table                            | Create Table                                                                                     |
+----------------------------------+--------------------------------------------------------------------------------------------------+
| JpaExampleCollection_OCCURRENCES | CREATE TABLE `JpaExampleCollection_OCCURRENCES` (
  `name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  `OCCURRENCES` varchar(255) DEFAULT NULL,
KEY `FK_JpaExampleCollection_OCCURRENCES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleCollection_OCCURRENCES_name`
FOREIGN KEY (`name`, `version`) REFERENCES `ExampleCollection` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+----------------------------------+--------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleCollection;
+-------------------+---------+
| name              | version |
+-------------------+---------+
| ExampleCollection | 1.0.0   |
+-------------------+---------+

MariaDB [controlloop]> select * from JpaExampleCollection_ATTRIBUTES;
+-------------------+---------+-----------------+----------------+
| name              | version | ATTRIBUTES      | ATTRIBUTES_KEY |
+-------------------+---------+-----------------+----------------+
| ExampleCollection | 1.0.0   | ValueAttribute2 | Attribute2     |
| ExampleCollection | 1.0.0   | ValueAttribute1 | Attribute1     |
+-------------------+---------+-----------------+----------------+

MariaDB [controlloop]> select * from JpaExampleCollection_OCCURRENCES;
+-------------------+---------+-------------+
| name              | version | OCCURRENCES |
+-------------------+---------+-------------+
| ExampleCollection | 1.0.0   | Occurrence1 |
| ExampleCollection | 1.0.0   | Occurrence2 |
+-------------------+---------+-------------+

Hibernate

MariaDB [controlloop]>  describe ExampleCollection;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleCollection_ATTRIBUTES;
+---------------------------------+---------------------------------------------------------------------------------------------------+
| Table                           | Create Table                                                                                      |
+---------------------------------+---------------------------------------------------------------------------------------------------+
| JpaExampleCollection_ATTRIBUTES | CREATE TABLE `JpaExampleCollection_ATTRIBUTES` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `attributes` longtext DEFAULT NULL,
  `attributes_KEY` varchar(255) NOT NULL,
  PRIMARY KEY (`name`,`version`,`attributes_KEY`),
  CONSTRAINT `FKrapsbq2h8eev8wstn9x11mfnr` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleCollection` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+---------------------------------+---------------------------------------------------------------------------------------------------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleCollection_OCCURRENCES;
+----------------------------------+--------------------------------------------------------------------------------------------------+
| Table                            | Create Table                                                                                     |
+----------------------------------+--------------------------------------------------------------------------------------------------+
| JpaExampleCollection_OCCURRENCES | CREATE TABLE `JpaExampleCollection_OCCURRENCES` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `occurrences` varchar(255) DEFAULT NULL,
  KEY `FKbvv6rdypcejif8yy1kr43vpob` (`name`,`version`),
  CONSTRAINT `FKbvv6rdypcejif8yy1kr43vpob` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleCollection` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+----------------------------------+--------------------------------------------------------------------------------------------------+

After saving an example:


MariaDB [controlloop]> select * from ExampleCollection;
+-------------------+---------+
| name              | version |
+-------------------+---------+
| ExampleCollection | 1.0.0   |
+-------------------+---------+
MariaDB [controlloop]> select * from JpaExampleCollection_ATTRIBUTES;
+-------------------+---------+-----------------+----------------+
| name              | version | attributes      | attributes_KEY |
+-------------------+---------+-----------------+----------------+
| ExampleCollection | 1.0.0   | ValueAttribute1 | Attribute1     |
| ExampleCollection | 1.0.0   | ValueAttribute2 | Attribute2     |
+-------------------+---------+-----------------+----------------+
MariaDB [controlloop]> select * from JpaExampleCollection_OCCURRENCES;
+-------------------+---------+-------------+
| name              | version | occurrences |
+-------------------+---------+-------------+
| ExampleCollection | 1.0.0   | Occurrence1 |
| ExampleCollection | 1.0.0   | Occurrence2 |
+-------------------+---------+-------------+

JpaToscaCapabilityAssignment_ATTRIBUTES table

Currently in tosca model template, due the complexity of the schema there are some issues in foreign keys using Collections of String. The SQL code below shows the JpaToscaCapabilityAssignment_ATTRIBUTES table.

Eclipse-Link

MariaDB [controlloop]> SHOW CREATE TABLE JpaToscaCapabilityAssignment_ATTRIBUTES;
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| Table                       | Create Table                                                                              |
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| JpaToscaCapabilityAssignment_ATTRIBUTES | CREATE TABLE `JpaToscaCapabilityAssignment_ATTRIBUTES` (
                                           `name` varchar(120) DEFAULT NULL,
 `version` varchar(20) DEFAULT NULL,
  `ATTRIBUTES` longtext DEFAULT NULL,
`ATTRIBUTES_KEY` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------------------+-------------------------------------------------------------------------------------------+

I have not found out why foreign key has not be generated in this table and in all '_ATTRIBUTES', '_META' and '_CONSTRAINTS' tables as well.

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE JpaToscaCapabilityAssignment_ATTRIBUTES;
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| Table                                   | Create Table                                                                              |
+-----------------------------------------+-------------------------------------------------------------------------------------------+
| JpaToscaCapabilityAssignment_ATTRIBUTES | CREATE TABLE `JpaToscaCapabilityAssignment_ATTRIBUTES` (
  `name` varchar(120) NOT NULL,
`version` varchar(20) NOT NULL,
`attributes` longtext DEFAULT NULL,
`attributes_KEY` varchar(255) NOT NULL,
PRIMARY KEY (`name`,`version`,`attributes_KEY`),
CONSTRAINT `FKjuqj4nashp9jx76h5eh5psp7l` FOREIGN KEY (`name`, `version`)
REFERENCES `ToscaCapabilityAssignment` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------------------+-------------------------------------------------------------------------------------------+

Map of Objects using ElementCollection

ElementCollection should be used with basic type or embeddable class, this example shows side effects using it with entity.

JpaExampleObjMapEc
@Entity
@Table(name = "ExampleObjMapEc")
@Data
public class JpaExampleObjMapEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    @Lob
    private Map<@NotNull String, @NotNull JpaExample> examples;
}

Eclipse-Link

MariaDB [controlloop]> describe ExampleObjMapEc;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjMapEc_EXAMPLES;
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| Table                       | Create Table                                                                                          |
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| JpaExampleObjMapEc_EXAMPLES | CREATE TABLE `JpaExampleObjMapEc_EXAMPLES` (
`name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  `EXAMPLES` longblob DEFAULT NULL,
  `EXAMPLES_KEY` varchar(255) DEFAULT NULL,
  KEY `FK_JpaExampleObjMapEc_EXAMPLES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleObjMapEc_EXAMPLES_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMapEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------+-------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleObjMapEc;
+---------------+---------+
| name          | version |
+---------------+---------+
| ExampleObjMap | 1.0.0   |
+---------------+---------+

MariaDB [controlloop]> select * from JpaExampleObjMapEc_EXAMPLES;
+---------------+---------+---------------------------+--------------+
| name          | version | EXAMPLES                | EXAMPLES_KEY |
+---------------+---------+---------------------------+--------------+
| ExampleObjMap | 1.0.0   |  .... <binary code> ....  |  MyKey1  |
| ExampleObjMap | 1.0.0   |  .... <binary code> .... |  MyKey2      |
+---------------+---------+---------------------------+--------------+

The image below shows the binary code.

Hibernate

MariaDB [controlloop]> describe ExampleObjMapEc;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjMapEc_EXAMPLES;
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| Table                       | Create Table                                                                                          |
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| JpaExampleObjMapEc_EXAMPLES | CREATE TABLE `JpaExampleObjMapEc_EXAMPLES` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `examples_name` varchar(120) NOT NULL,
`examples_version` varchar(20) NOT NULL,
  `examples_KEY` varchar(255) NOT NULL,
PRIMARY KEY (`name`,`version`,`examples_KEY`),
  UNIQUE KEY `UK_o5b5lwcueiue1x7wf2j9l0ohb` (`examples_name`,`examples_version`),
  CONSTRAINT `FKeu2s8p9mhstus32uliuwib8rr` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMapEc` (`name`, `version`),
  CONSTRAINT `FKf66pkeal9tdygic4pvspxhph5` FOREIGN KEY (`examples_name`, `examples_version`)
REFERENCES `Example` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------+-------------------------------------------------------------------------------------------------------+


After saving an example (it needs an extra step: save JpaExample objects before JpaExampleObjMapEc object):


MariaDB [controlloop]> select * from ExampleObjMapEc;
+-----------------+---------+
| name            | version |
+-----------------+---------+
| ExampleObjMapEc | 1.0.0   |
+-----------------+---------+
MariaDB [controlloop]> select * from Example;
+----------+---------+--------+-----------+
| name     | version | primed | timeStamp |
+----------+---------+--------+-----------+
| example1 | 1.0.0   | NULL   | NULL      |
| example2 | 1.0.0   | NULL   | NULL      |
+----------+---------+--------+-----------+
MariaDB [controlloop]> select * from JpaExampleObjMapEc_EXAMPLES;
+-----------------+---------+---------------+------------------+--------------+
| name            | version | examples_name | examples_version | examples_KEY |
+-----------------+---------+---------------+------------------+--------------+
| ExampleObjMapEc | 1.0.0   | example1      | 1.0.0            | MyKey1       |
| ExampleObjMapEc | 1.0.0   | example2      | 1.0.0            | MyKey2       |
+-----------------+---------+---------------+------------------+--------------+

Map of Objects using ElementCollection (fixed)

The below example shows ElementCollection with embedded class. In order to avoid collisions with field names ("name" and "version"), it has been used AttributeOverride annotation to change their names.

JpaExampleObjMapEc
@Data
@Embeddable
public class JpaExampleEmd implements Serializable {

    private static final long serialVersionUID = 1L;

    @VerifyKey
    @NotNull
    @AttributeOverride(name = "name", column = @Column(name = "child_name"))
    @AttributeOverride(name = "version", column = @Column(name = "child_version"))
    private ExampleKey key;

    @Column
    private Boolean primed;

    @Column(name = "timeStamp", precision = 3)
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
    private Date timeStamp;
}

@Entity
@Table(name = "ExampleObjMapEc")
@Data
public class JpaExampleObjMapEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    private Map<@NotNull String, @NotNull JpaExampleEmd> examples;
}

Eclipse-Link

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjMapEc_EXAMPLES;
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| Table                       | Create Table                                   |
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| JpaExampleObjMapEc_EXAMPLES | CREATE TABLE `JpaExampleObjMapEc_EXAMPLES` (
  `EXAMPLES_KEY` varchar(255) DEFAULT NULL,
  `PRIMED` tinyint(1) DEFAULT 0,
  `timeStamp` varchar(255) DEFAULT NULL,
  `child_name` varchar(255) DEFAULT NULL,
  `child_version` varchar(255) DEFAULT NULL,
  `name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  KEY `FK_JpaExampleObjMapEc_EXAMPLES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleObjMapEc_EXAMPLES_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMapEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------+-------------------------------------------------------------------------------------------------------+


After saving the example:


MariaDB [controlloop]> select * from ExampleObjMapEc;
+---------------+---------+
| name          | version |
+---------------+---------+
| ExampleObjMap | 1.0.0   |
+---------------+---------+

MariaDB [controlloop]> select * from JpaExampleObjMapEc_EXAMPLES;
+--------------+--------+-----------+------------+---------------+---------------+---------+
| EXAMPLES_KEY | PRIMED | timeStamp | child_name | child_version | name          | version |
+--------------+--------+-----------+------------+---------------+---------------+---------+
| MyKey2       |   NULL | NULL      | example2   | 1.0.0         | ExampleObjMap | 1.0.0   |
| MyKey1       |   NULL | NULL      | example1   | 1.0.0         | ExampleObjMap | 1.0.0   |
+--------------+--------+-----------+------------+---------------+---------------+---------+

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjMapEc_EXAMPLES;
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| Table                       | Create Table                                   |
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| JpaExampleObjMapEc_EXAMPLES | CREATE TABLE `JpaExampleObjMapEc_EXAMPLES` (
`name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
`child_name` varchar(255) DEFAULT NULL,
  `child_version` varchar(255) DEFAULT NULL,
  `primed` bit(1) DEFAULT NULL,
  `timeStamp` datetime(6) DEFAULT NULL,
  `examples_KEY` varchar(255) NOT NULL,
  PRIMARY KEY (`name`,`version`,`examples_KEY`),
CONSTRAINT `FKeu2s8p9mhstus32uliuwib8rr` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMapEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------+-------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleObjMapEc;
+-----------------+---------+
| name            | version |
+-----------------+---------+
| ExampleObjMapEc | 1.0.0   |
+-----------------+---------+

MariaDB [controlloop]> select * from JpaExampleObjMapEc_EXAMPLES;
+-----------------+---------+------------+---------------+--------+-----------+--------------+
| name            | version | child_name | child_version | primed | timeStamp | examples_KEY |
+-----------------+---------+------------+---------------+--------+-----------+--------------+
| ExampleObjMapEc | 1.0.0   | example1   | 1.0.0         | NULL   | NULL      | MyKey1       |
| ExampleObjMapEc | 1.0.0   | example2   | 1.0.0         | NULL   | NULL      | MyKey2       |
+-----------------+---------+------------+---------------+--------+-----------+--------------+

Map of Objects using ElementCollection (hacked)

In this scenario JpaExampleLob class is not entity and neither embedded.

JpaExampleObjMapEc
@Data
public class JpaExampleLob implements Serializable {

    private static final long serialVersionUID = 1L;

    @VerifyKey
    @NotNull
    private ExampleKey key;

    private Boolean primed;

    @NotNull
    private Date timeStamp;
}

@Entity
@Table(name = "ExampleObjMapEc")
@Data
public class JpaExampleObjMapEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    @Lob
    private Map<@NotNull String, @NotNull JpaExampleLob> examples;
}

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjMapEc_EXAMPLES;
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| Table                       | Create Table                                                                                          |
+-----------------------------+-------------------------------------------------------------------------------------------------------+
| JpaExampleObjMapEc_EXAMPLES | CREATE TABLE `JpaExampleObjMapEc_EXAMPLES` (
`name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `examples` longblob DEFAULT NULL,
  `examples_KEY` varchar(255) NOT NULL,
  PRIMARY KEY (`name`,`version`,`examples_KEY`),
  CONSTRAINT `FKeu2s8p9mhstus32uliuwib8rr` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMapEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------------+-------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from JpaExampleObjMapEc_EXAMPLES;
+-----------------+---------+---------------------------+--------------+
| name            | version | examples                 | examples_KEY |
+-----------------+---------+---------------------------+--------------+
| ExampleObjMapEc | 1.0.0   |  .... <binary code> .... | MyKey1       |
| ExampleObjMapEc | 1.0.0   |  .... <binary code> .... | MyKey2       |
+-----------------+---------+---------------------------+--------------+

JpaToscaDataType_PROPERTIES table

The SQL code below shows JpaToscaDataType_PROPERTIES table.

Eclipse-Link

MariaDB [controlloop]> describe JpaToscaDataType_PROPERTIES;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| name           | varchar(120) | YES  |     | NULL    |       |
| version        | varchar(20)  | YES  |     | NULL    |       |
| PROPERTIES     | longblob     | YES  |     | NULL    |       |
| PROPERTIES_KEY | varchar(255) | YES  |     | NULL    |       |
+----------------+--------------+------+-----+---------+-------+

MariaDB [controlloop]> SELECT count(1) FROM `JpaToscaDataType_PROPERTIES`;
+----------+
| count(1) |
+----------+
|       41 |
+----------+

MariaDB [controlloop]> describe ToscaProperty;
+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| DEFAULTVALUE     | varchar(255) | YES  |     | NULL    |       |
| DESCRIPTION      | varchar(255) | YES  |     | NULL    |       |
| ENTRYSCHEMA      | longblob     | YES  |     | NULL    |       |
| REQUIRED         | tinyint(1)   | YES  |     | 0       |       |
| STATUS           | int(11)      | YES  |     | NULL    |       |
| parentLocalName  | varchar(120) | NO   | PRI | NULL    |       |
| localName        | varchar(120) | NO   | PRI | NULL    |       |
| parentKeyVersion | varchar(15)  | NO   | PRI | NULL    |       |
| parentKeyName    | varchar(120) | NO   | PRI | NULL    |       |
| name             | varchar(120) | YES  |     | NULL    |       |
| version          | varchar(20)  | YES  |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

MariaDB [controlloop]>  SELECT count(1) FROM  ToscaProperty;
+----------+
| count(1) |
+----------+
|        0 |
+----------+

Note

Right now JpaToscaProperty will generate ToscaProperty table but this one will never used.

List of Objects using ElementCollection

ElementCollection should be used with basic type or embeddable class, this example shows side effects using it with entity.

JpaExampleObjListEc
@Entity
@Table(name = "ExampleObjListEc")
@Data
public class JpaExampleObjListEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    @Lob
    private List<@NotNull JpaExample> examples;
}

Eclipse-Link

MariaDB [controlloop]> describe ExampleObjListEc;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjListEc_EXAMPLES;
+------------------------------+------------------------------------------------------------------------------------------------------+
| Table                        | Create Table                                                                                         |
+------------------------------+------------------------------------------------------------------------------------------------------+
| JpaExampleObjListEc_EXAMPLES | CREATE TABLE `JpaExampleObjListEc_EXAMPLES` (
                                 `name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  `EXAMPLES` longblob DEFAULT NULL,
  KEY `FK_JpaExampleObjListEc_EXAMPLES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleObjListEc_EXAMPLES_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjListEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------------------+------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleObjListEc;
+-------------+---------+
| name        | version |
+-------------+---------+
| ExampleList | 1.0.0   |
+-------------+---------+
MariaDB [controlloop]> select * from JpaExampleObjListEc_EXAMPLES;
+-------------+---------+---------------------------+
| name        | version | EXAMPLES                  |
+-------------+---------+---------------------------+
| ExampleList | 1.0.0   |  .... <binary code> .... |
| ExampleList | 1.0.0   |  .... <binary code> .... |
+-------------+---------+---------------------------+

Hibernate

MariaDB [controlloop]> describe ExampleObjListEc;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+


MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjListEc_EXAMPLES;
+------------------------------+------------------------------------------------------------------------------------------------------+
| Table                        | Create Table                                                                                         |
+------------------------------+------------------------------------------------------------------------------------------------------+
| JpaExampleObjListEc_EXAMPLES | CREATE TABLE `JpaExampleObjListEc_EXAMPLES` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `examples_name` varchar(120) NOT NULL,
  `examples_version` varchar(20) NOT NULL,
  UNIQUE KEY `UK_8nnxsomci4yiwc8ks6radimiq` (`examples_name`,`examples_version`),
  KEY `FK1a58hldurq1910ne2hbm9a7af` (`name`,`version`),
  CONSTRAINT `FK1a58hldurq1910ne2hbm9a7af` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjListEc` (`name`, `version`),
  CONSTRAINT `FKnj1lga10so090q9wf38k4jf7p` FOREIGN KEY (`examples_name`, `examples_version`)
REFERENCES `Example` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------------------+------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from Example;
+----------+---------+--------+-----------+
| name     | version | primed | timeStamp |
+----------+---------+--------+-----------+
| example1 | 1.0.0   | NULL   | NULL      |
| example2 | 1.0.0   | NULL   | NULL      |
+----------+---------+--------+-----------+
MariaDB [controlloop]> select * from ExampleObjListEc;
+-------------+---------+
| name        | version |
+-------------+---------+
| ExampleList | 1.0.0   |
+-------------+---------+
MariaDB [controlloop]> select * from JpaExampleObjListEc_EXAMPLES;
+-------------+---------+---------------+------------------+
| name        | version | examples_name | examples_version |
+-------------+---------+---------------+------------------+
| ExampleList | 1.0.0   | example1      | 1.0.0            |
| ExampleList | 1.0.0   | example2      | 1.0.0            |
+-------------+---------+---------------+------------------+

List of Objects using ElementCollection (fixed)

The below example shows ElementCollection with embedded class.

JpaExampleObjListEc
@Entity
@Table(name = "ExampleObjListEc")
@Data
public class JpaExampleObjListEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    private List<@NotNull JpaExampleEmd> examples;
 }

Eclipse-Link

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjListEc_EXAMPLES;
+------------------------------+------------------------------------------------------------------------------------------------------+
| Table                        | Create Table                                                                                         |
+------------------------------+------------------------------------------------------------------------------------------------------+
| JpaExampleObjListEc_EXAMPLES | CREATE TABLE `JpaExampleObjListEc_EXAMPLES` (
  `PRIMED` tinyint(1) DEFAULT 0,
  `timeStamp` varchar(255) DEFAULT NULL,
`child_name` varchar(255) DEFAULT NULL,
  `child_version` varchar(255) DEFAULT NULL,
  `name` varchar(120) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  KEY `FK_JpaExampleObjListEc_EXAMPLES_name` (`name`,`version`),
  CONSTRAINT `FK_JpaExampleObjListEc_EXAMPLES_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjListEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------------------+------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleObjListEc;
+-------------+---------+
| name        | version |
+-------------+---------+
| ExampleList | 1.0.0   |
+-------------+---------+
MariaDB [controlloop]> select * from JpaExampleObjListEc_EXAMPLES;
+--------+-----------+------------+---------------+-------------+---------+
| PRIMED | timeStamp | child_name | child_version | name        | version |
+--------+-----------+------------+---------------+-------------+---------+
|   NULL | NULL      | example1   | 1.0.0         | ExampleList | 1.0.0   |
|   NULL | NULL      | example2   | 1.0.0         | ExampleList | 1.0.0   |
+--------+-----------+------------+---------------+-------------+---------+

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjListEc_EXAMPLES;
+------------------------------+------------------------------------------------------------------------------------------------------+
| Table                        | Create Table                                                                                         |
+------------------------------+------------------------------------------------------------------------------------------------------+
| JpaExampleObjListEc_EXAMPLES | CREATE TABLE `JpaExampleObjListEc_EXAMPLES` (
  `name` varchar(120) NOT NULL,
 `version` varchar(20) NOT NULL,
 `child_name` varchar(255) DEFAULT NULL,
 `child_version` varchar(255) DEFAULT NULL,
 `primed` bit(1) DEFAULT NULL,
 `timeStamp` datetime(6) DEFAULT NULL,
  KEY `FK1a58hldurq1910ne2hbm9a7af` (`name`,`version`),
  CONSTRAINT `FK1a58hldurq1910ne2hbm9a7af` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjListEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------------------+------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from ExampleObjListEc;
+-------------+---------+
| name        | version |
+-------------+---------+
| ExampleList | 1.0.0   |
+-------------+---------+
MariaDB [controlloop]> select * from JpaExampleObjListEc_EXAMPLES;
+-------------+---------+------------+---------------+--------+-----------+
| name        | version | child_name | child_version | primed | timeStamp |
+-------------+---------+------------+---------------+--------+-----------+
| ExampleList | 1.0.0   | example1   | 1.0.0         | NULL   | NULL      |
| ExampleList | 1.0.0   | example2   | 1.0.0         | NULL   | NULL      |
+-------------+---------+------------+---------------+--------+-----------+

List of Objects using ElementCollection (hacked)

In this scenario JpaExampleLob class is not entity and neither embedded.

JpaExampleObjListEc
@Entity
@Table(name = "ExampleObjListEc")
@Data
public class JpaExampleObjListEc implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @ElementCollection
    @Lob
    private List<@NotNull JpaExampleLob> examples;
}

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE JpaExampleObjListEc_EXAMPLES;
+------------------------------+------------------------------------------------------------------------------------------------------+
| Table                        | Create Table                                                                                         |
+------------------------------+------------------------------------------------------------------------------------------------------+
| JpaExampleObjListEc_EXAMPLES | CREATE TABLE `JpaExampleObjListEc_EXAMPLES` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `examples` longblob DEFAULT NULL,
  KEY `FK1a58hldurq1910ne2hbm9a7af` (`name`,`version`),
  CONSTRAINT `FK1a58hldurq1910ne2hbm9a7af` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjListEc` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------------------+------------------------------------------------------------------------------------------------------+


After saving an example:


MariaDB [controlloop]> select * from JpaExampleObjListEc_EXAMPLES;
+-------------+---------+---------------------------+
| name        | version | examples  |
+-------------+---------+---------------------------+
| ExampleList | 1.0.0   |  .... <binary code> .... |
| ExampleList | 1.0.0   |  .... <binary code> .... |
+-------------+---------+---------------------------+

Map of Objects using OneToMany

OneToMany is not used in tosca model template. The example below shows an alternative to ElementCollection. In this example there is a field names collision.

JpaExampleObjMap
@Entity
@Table(name = "ExampleObjMap")
@Data
public class JpaExampleObjMap implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Lob
    private Map<@NotNull String, @NotNull JpaExample> examples;
}

Representation of the example in YAML of what we could save using JpaExampleObjMap entity.

Example
ExampleObjMap:
  name: ExampleObjMap
  version: 1.0.0
  examples:
    MyKey1:
      name: example1
      version: 1.0.0
     MyKey2:
      name: example2
      version: 1.0.0

Eclipse-Link

MariaDB [controlloop]> describe ExampleObjMap;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| EXAMPLES | longblob     | YES  |     | NULL    |       |
| name     | varchar(120) | NO   | PRI | NULL    |       |
| version  | varchar(20)  | NO   | PRI | NULL    |       |
+----------+--------------+------+-----+---------+-------+


After saving the example:


MariaDB [controlloop]> select * from ExampleObjMap;
+--------------------------+---------------+---------+
| EXAMPLES                 | name          | version |
+--------------------------+---------------+---------+
| .... <binary code> .... | ExampleObjMap | 1.0.0   |
+--------------------------+---------------+---------+

Removing @Lob Annotation

The keys name and version of the JpaExampleObjMap as the same as JpaExample, so Eclipse-Link creates a wrong ExampleObjMap_Example table.

MariaDB [controlloop]> describe ExampleObjMap;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(120) | NO   | PRI | NULL    |       |
| version | varchar(20)  | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+

MariaDB [controlloop]> SHOW CREATE TABLE ExampleObjMap_Example;
+-----------------------+-------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                |
+-----------------------+-------------------------------------------------------------------------------------------------------------+
| ExampleObjMap_Example | CREATE TABLE `ExampleObjMap_Example` (
  `name` varchar(120) NOT NULL,
  `version` varchar(20) NOT NULL,
  `EXAMPLES_KEY` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`name`,`version`),
  CONSTRAINT `FK_ExampleObjMap_Example_name` FOREIGN KEY (`name`, `version`)
REFERENCES `ExampleObjMap` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------+-------------------------------------------------------------------------------------------------------------+


Using these tables I have got this error: Cannot add or update a child row: a foreign key constraint fails (`controlloop`.`ExampleObjMap_Example`, CONSTRAINT `FK_ExampleObjMap_Example_name` FOREIGN KEY (`name`, `version`) REFERENCES `ExampleObjMap` (`name`, `version`))
Error Code: 1452

Map of Objects using OneToMany (fixed)

The example below shows an alternative to ElementCollection with the fix to avoid field names collision.

JpaExampleObjMap
@Entity
@Table(name = "ExampleObjMap")
@Data
public class JpaExampleObjMap implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    @VerifyKey
    @NotNull
    private ExampleKey key;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            joinColumns = {@JoinColumn(name = "parent_name", referencedColumnName = "name"),
                    @JoinColumn(name = "parent_version", referencedColumnName = "version")},
            inverseJoinColumns = {@JoinColumn(name = "child_name", referencedColumnName = "name"),
                    @JoinColumn(name = "child_version", referencedColumnName = "version")})
    private Map<@NotNull String, @NotNull JpaExample> examples;
}

Eclipse-Link

MariaDB [controlloop]> SHOW CREATE TABLE ExampleObjMap_Example;
+-----------------------+-------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                |
+-----------------------+-------------------------------------------------------------------------------------------------------------+
| ExampleObjMap_Example | CREATE TABLE `ExampleObjMap_Example` (
`parent_name` varchar(120) NOT NULL,
  `parent_version` varchar(20) NOT NULL,
  `child_name` varchar(120) NOT NULL,
  `child_version` varchar(20) NOT NULL,
  `EXAMPLES_KEY` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`parent_name`,`parent_version`,`child_name`,`child_version`),
  KEY `FK_ExampleObjMap_Example_child_name` (`child_name`,`child_version`),
  CONSTRAINT `FK_ExampleObjMap_Example_child_name` FOREIGN KEY (`child_name`, `child_version`)
REFERENCES `Example` (`name`, `version`),
  CONSTRAINT `FK_ExampleObjMap_Example_parent_name` FOREIGN KEY (`parent_name`, `parent_version`)
REFERENCES `ExampleObjMap` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------+-------------------------------------------------------------------------------------------------------------+


After saving the example:


MariaDB [controlloop]> select * from ExampleObjMap;
+---------------+---------+
| name          | version |
+---------------+---------+
| ExampleObjMap | 1.0.0   |
+---------------+---------+
MariaDB [controlloop]> select * from Example;
+--------+-----------+----------+---------+
| PRIMED | timeStamp | name     | version |
+--------+-----------+----------+---------+
|   NULL | NULL      | example1 | 1.0.0   |
|   NULL | NULL      | example2 | 1.0.0   |
+--------+-----------+----------+---------+
MariaDB [controlloop]> select * from ExampleObjMap_Example;
+---------------+----------------+------------+---------------+--------------+
| parent_name   | parent_version | child_name | child_version | EXAMPLES_KEY |
+---------------+----------------+------------+---------------+--------------+
| ExampleObjMap | 1.0.0          | example1   | 1.0.0         | MyKey1       |
| ExampleObjMap | 1.0.0          | example2   | 1.0.0         | MyKey2       |
+---------------+----------------+------------+---------------+--------------+

Hibernate

MariaDB [controlloop]> SHOW CREATE TABLE ExampleObjMap_Example;

+-----------------------+-------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                |
+-----------------------+-------------------------------------------------------------------------------------------------------------+
| ExampleObjMap_Example | CREATE TABLE `ExampleObjMap_Example` (
  `parent_name` varchar(120) NOT NULL,
  `parent_version` varchar(20) NOT NULL,
  `child_name` varchar(120) NOT NULL,
  `child_version` varchar(20) NOT NULL,
  `examples_KEY` varchar(255) NOT NULL,
  PRIMARY KEY (`parent_name`,`parent_version`,`examples_KEY`),
  UNIQUE KEY `UK_ma8t20i58tt5ilqjrk2ged242` (`child_name`,`child_version`),
  CONSTRAINT `FK2n1x5g38x55wejkvnvhqin980` FOREIGN KEY (`parent_name`, `parent_version`)
REFERENCES `ExampleObjMap` (`name`, `version`),
  CONSTRAINT `FKstwyuf69lrj4tjpafwriuwp3h` FOREIGN KEY (`child_name`, `child_version`)
REFERENCES `Example` (`name`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-----------------------+-------------------------------------------------------------------------------------------------------------+


After saving the example:


MariaDB [controlloop]> select * from ExampleObjMap;
+---------------+---------+
| name          | version |
+---------------+---------+
| ExampleObjMap | 1.0.0   |
+---------------+---------+

MariaDB [controlloop]> select * from Example;
+----------+---------+--------+-----------+
| name     | version | primed | timeStamp |
+----------+---------+--------+-----------+
| example1 | 1.0.0   | NULL   | NULL      |
| example2 | 1.0.0   | NULL   | NULL      |
+----------+---------+--------+-----------+

MariaDB [controlloop]> select * from ExampleObjMap_Example;
+---------------+----------------+------------+---------------+--------------+
| parent_name   | parent_version | child_name | child_version | examples_KEY |
+---------------+----------------+------------+---------------+--------------+
| ExampleObjMap | 1.0.0          | example1   | 1.0.0         | MyKey1       |
| ExampleObjMap | 1.0.0          | example2   | 1.0.0         | MyKey2       |
+---------------+----------------+------------+---------------+--------------+

Multi templates

Right now using Spring repositories it is possible to create more than one service template, as service templates in policy-models/tosca. It works in both Eclipse-Link and Hibernate.

How to create additional service template (just add different name and version into the yaml file):

tosca-for-smoke-testing.yaml
name: ToscaServiceTemplateSimple
version: 1.0.1
tosca_definitions_version: tosca_simple_yaml_1_3
...........................


ToscaServiceTemplate
MariaDB [controlloop]> select * from ToscaServiceTemplate;
+-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+
| DESCRIPTION | TOSCADEFINITIONSVERSION | derived_from_name | derived_from_version | name                       | version | capabilityTypesVersion | capabilityTypesName | dataTypesName        | dataTypesVersion | nodeTypesVersion | nodeTypesName        | policyTypesName | policyTypesVersion | relationshipTypesVersion | relationshipTypesName | topologyTemplateLocalName   | topologyTemplateParentKeyName | topologyTemplateParentKeyVersion | topologyTemplateParentLocalName |
+-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+
| NULL        | tosca_simple_yaml_1_3   | NULL              | NULL                 | ToscaServiceTemplateSimple | 1.0.0   | NULL                   | NULL                | ToscaDataTypesSimple | 1.0.0            | 1.0.0            | ToscaNodeTypesSimple | NULL            | NULL               | NULL                     | NULL                  | ToscaTopologyTemplateSimple | ToscaServiceTemplateSimple    | 1.0.0                            | NULL                            |
| NULL        | tosca_simple_yaml_1_3   | NULL              | NULL                 | ToscaServiceTemplateSimple | 1.0.1   | NULL                   | NULL                | ToscaDataTypesSimple | 1.0.0            | 1.0.0            | ToscaNodeTypesSimple | NULL            | NULL               | NULL                     | NULL                  | ToscaTopologyTemplateSimple | ToscaServiceTemplateSimple    | 1.0.0                            | NULL                            |
+-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+
MariaDB [controlloop]> select * from ToscaNodeTemplates;
+--------------------------+---------+
| name                     | version |
+--------------------------+---------+
| ToscaNodeTemplatesSimple | 1.0.0   |
+--------------------------+---------+

In the above example for ToscaNodeTemplate we are using same name and version, so the ToscaNodeTemplates table (and all other tables as well) contains only one record. Using the current entity model definition there are the follow issues:

  • There is no way to handle different configuration
  • Is impossible to delete a template in cascade, but it needs a Java code to manual delete single records in all tables

At least to avoid the above issues:

  • Avoid default name and version (for each template/node/data type, etc.. name and version have to be mandatory)
  • Java code to manual check for each table if name and version are already used

Conclusion

  • Move to Hibernate with EclipseLink tables is possible.
  • The presence of longblob types used to store whole objects is an issues, it is readable only by Java language or by any other language compatible with Java binary code. I am not sure if a db-migrator can handle that.
  • Document databases store all information for a given object in a single instance in the database, and every stored object can be different from every other. So, using MongoDB/Cassandra will solve all issues. JpaRepository and MongoRepository extend CrudRepository and expose the capabilities of the underlying persistence technology in addition to the rather generic persistence technology-agnostic interfaces like e.g. CrudRepository.



  • No labels