From 0b78493a30ccec8f9f29e25a60c33f099596205a Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Mon, 2 Oct 2023 14:22:08 +0200
Subject: [PATCH] WIP: String IDs

---
 .../implementation/MySQL/DatabaseUtils.java   | 16 ++++----
 .../MySQL/MySQLDeleteEntityProperties.java    |  2 +-
 .../MySQL/MySQLDeleteSparseEntity.java        |  2 +-
 .../MySQL/MySQLGetChildren.java               |  2 +-
 .../MySQL/MySQLGetDependentEntities.java      |  2 +-
 .../MySQL/MySQLGetFileRecordByPath.java       |  2 +-
 .../MySQL/MySQLInsertEntityDatatype.java      |  4 +-
 .../MySQL/MySQLInsertEntityProperties.java    | 10 ++---
 .../MySQL/MySQLInsertParents.java             |  4 +-
 .../MySQL/MySQLInsertSparseEntity.java        |  4 +-
 .../MySQL/MySQLInsertTransactionHistory.java  |  2 +-
 .../implementation/MySQL/MySQLIsSubType.java  |  4 +-
 .../MySQL/MySQLRetrieveAllUncheckedFiles.java |  4 +-
 .../MySQL/MySQLRetrieveEntityACL.java         |  4 +-
 .../MySQL/MySQLRetrieveParents.java           |  2 +-
 .../MySQL/MySQLRetrieveProperties.java        | 29 ++++++--------
 .../MySQLRetrieveQueryTemplateDefinition.java |  2 +-
 .../MySQL/MySQLRetrieveSparseEntity.java      |  2 +-
 .../MySQL/MySQLRetrieveVersionHistory.java    |  2 +-
 .../MySQLSetFileCheckedTimestampImpl.java     |  2 +-
 .../MySQL/MySQLSetFileChecksum.java           |  2 +-
 .../MySQLSetQueryTemplateDefinition.java      |  2 +-
 .../MySQL/MySQLUpdateSparseEntity.java        |  4 +-
 .../interfaces/RetrieveEntityACLImpl.java     |  2 +-
 .../RetrieveEntityACLTransaction.java         |  2 +-
 .../server/database/proto/FlatProperty.java   |  2 +-
 .../database/proto/VerySparseEntity.java      |  2 +-
 .../java/org/caosdb/server/entity/Entity.java |  6 ++-
 .../org/caosdb/server/entity/EntityID.java    | 40 ++++++++++---------
 .../server/entity/EntityIdRegistry.java       |  4 +-
 .../org/caosdb/server/entity/MagicTypes.java  |  8 ++--
 .../server/jobs/core/EntityIdHandler.java     |  2 +-
 .../java/org/caosdb/server/query/Query.java   |  2 +-
 .../caosdb/server/transaction/UpdateACL.java  |  2 +-
 .../server/transaction/WriteTransaction.java  |  2 +-
 .../WriteTransactionInterface.java            |  2 +-
 .../implementation/MySQL/InsertTest.java      | 18 ++++-----
 37 files changed, 102 insertions(+), 101 deletions(-)

diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
index c87ef79a..e7b684e6 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
@@ -152,10 +152,10 @@ public class DatabaseUtils {
   public static void parseOverrides(final List<ProtoProperty> properties, final ResultSet rs)
       throws SQLException {
     while (rs.next()) {
-      int property_id = rs.getInt("property_id");
-      if (rs.wasNull()) property_id = rs.getInt("InternalPropertyID");
+      String property_id = rs.getString("property_id");
+      if (rs.wasNull()) property_id = rs.getString("InternalPropertyID");
       for (final FlatProperty p : properties) {
-        if (p.id == property_id) {
+        if (p.id.equals(property_id)) {
           final String name = bytes2UTF8(rs.getBytes("name_override"));
           if (name != null) {
             p.name = name;
@@ -181,9 +181,9 @@ public class DatabaseUtils {
     final List<ProtoProperty> ret = new LinkedList<>();
     while (rs.next()) {
       ProtoProperty pp = new ProtoProperty();
-      pp.id = rs.getInt("PropertyID");
+      pp.id = rs.getString("PropertyID");
       if (rs.wasNull()) {
-        pp.id = rs.getInt("InternalPropertyID");
+        pp.id = rs.getString("InternalPropertyID");
       }
       pp.value = bytes2UTF8(rs.getBytes("PropertyValue"));
       pp.status = bytes2UTF8(rs.getBytes("PropertyStatus"));
@@ -219,7 +219,7 @@ public class DatabaseUtils {
    */
   public static SparseEntity parseEntityResultSet(final ResultSet rs) throws SQLException {
     final SparseEntity ret = parseNameRoleACL(rs);
-    ret.id = rs.getInt("EntityID");
+    ret.id = rs.getString("EntityID");
     ret.description = bytes2UTF8(rs.getBytes("EntityDesc"));
     ret.datatype = bytes2UTF8(rs.getBytes("Datatype"));
     ret.collection = bytes2UTF8(rs.getBytes("Collection"));
@@ -237,7 +237,7 @@ public class DatabaseUtils {
     final LinkedList<VerySparseEntity> ret = new LinkedList<>();
     while (rs.next()) {
       final VerySparseEntity vsp = new VerySparseEntity();
-      vsp.id = rs.getInt("ParentID");
+      vsp.id = rs.getString("ParentID");
       vsp.name = bytes2UTF8(rs.getBytes("ParentName"));
       vsp.description = bytes2UTF8(rs.getBytes("ParentDescription"));
       vsp.role = bytes2UTF8(rs.getBytes("ParentRole"));
@@ -251,7 +251,7 @@ public class DatabaseUtils {
       EntityInterface entity, List<ProtoProperty> protos) {
     final ArrayList<Property> ret = new ArrayList<Property>();
     for (final ProtoProperty pp : protos) {
-      if (pp.id.equals(entity.getId().toInteger())) {
+      if (pp.id.equals(entity.getId().toString())) {
         if (pp.value != null) {
           entity.setValue(new GenericValue(pp.value));
         }
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
index f8cba7d4..615adca4 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
@@ -44,7 +44,7 @@ public class MySQLDeleteEntityProperties extends MySQLTransaction
     try {
       final PreparedStatement stmt = prepareStatement(STMT_DELETE_ENTITY_PROPERTIES);
 
-      stmt.setInt(1, id.toInteger());
+      stmt.setString(1, id.toString());
       stmt.execute();
     } catch (final SQLIntegrityConstraintViolationException exc) {
       throw new IntegrityException(exc);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
index 7fe8ac30..b6348646 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
@@ -44,7 +44,7 @@ public class MySQLDeleteSparseEntity extends MySQLTransaction implements DeleteS
     try {
       final PreparedStatement stmt = prepareStatement(STMT_DELETE_SPARSE_ENTITY);
 
-      stmt.setInt(1, id.toInteger());
+      stmt.setString(1, id.toString());
       stmt.execute();
     } catch (final SQLIntegrityConstraintViolationException exc) {
       throw new IntegrityException(exc);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
index 64963941..3d3662c6 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
@@ -44,7 +44,7 @@ public class MySQLGetChildren extends MySQLTransaction implements GetChildrenImp
     try {
       final PreparedStatement stmt = prepareStatement(STMT_GET_CHILDREN);
 
-      stmt.setInt(1, entity.toInteger());
+      stmt.setString(1, entity.toString());
 
       ResultSet rs = null;
       try {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
index 9384c8a0..fabe5233 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
@@ -45,7 +45,7 @@ public class MySQLGetDependentEntities extends MySQLTransaction
     try {
       final PreparedStatement stmt = prepareStatement(STMT_GET_DEPENDENT_ENTITIES);
 
-      stmt.setInt(1, entity.toInteger());
+      stmt.setString(1, entity.toString());
 
       final ResultSet rs = stmt.executeQuery();
       try {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetFileRecordByPath.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetFileRecordByPath.java
index 16d84002..922c2b6b 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetFileRecordByPath.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetFileRecordByPath.java
@@ -49,7 +49,7 @@ public class MySQLGetFileRecordByPath extends MySQLTransaction implements GetFil
       try {
         if (rs.next()) {
           final SparseEntity ret = new SparseEntity();
-          ret.id = rs.getInt("entity_id");
+          ret.id = rs.getString("entity_id");
           ret.fileHash = rs.getString("file_hash");
           ret.fileSize = rs.getLong("size");
           ret.fileChecked = rs.getLong("checked_timestamp");
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
index e9ca7fd1..7aa692e4 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
@@ -33,7 +33,7 @@ public class MySQLInsertEntityDatatype extends MySQLTransaction
       final PreparedStatement insertEntityDatatypeStmt =
           prepareStatement(STMT_INSERT_ENTITY_DATATYPE);
 
-      insertEntityDatatypeStmt.setInt(1, entity.id);
+      insertEntityDatatypeStmt.setString(1, entity.id);
       insertEntityDatatypeStmt.setString(2, entity.datatype);
 
       insertEntityDatatypeStmt.execute();
@@ -42,7 +42,7 @@ public class MySQLInsertEntityDatatype extends MySQLTransaction
         final PreparedStatement insertEntityCollectionStmt =
             prepareStatement(STMT_INSERT_ENTITY_COLLECTION);
 
-        insertEntityCollectionStmt.setInt(1, entity.id);
+        insertEntityCollectionStmt.setString(1, entity.id);
         insertEntityCollectionStmt.setString(2, entity.collection);
 
         insertEntityCollectionStmt.execute();
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
index becb56a2..8d706604 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
@@ -89,9 +89,9 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_ENTITY_PROPERTY);
 
-      stmt.setInt(1, domain.toInteger());
-      stmt.setInt(2, entity.toInteger());
-      stmt.setInt(3, fp.id);
+      stmt.setString(1, domain.toString());
+      stmt.setString(2, entity.toString());
+      stmt.setString(3, fp.id);
       stmt.setString(4, table.toString());
 
       stmt.setString(5, fp.value);
@@ -124,7 +124,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
       final FlatProperty fp = new FlatProperty();
       Table table = Table.null_data;
       Long unit_sig = null;
-      fp.id = property.getId().toInteger();
+      fp.id = property.getId().toString();
       fp.idx = property.getPIdx();
       fp.status = property.getStatementStatus().name();
 
@@ -140,7 +140,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
         fp.value = fp.id.toString();
 
         // id is to be the replacement id (an internally used/private id)
-        fp.id = ((ReferenceValue) property.getValue()).getId().toInteger();
+        fp.id = ((ReferenceValue) property.getValue()).getId().toString();
         table = Table.reference_data;
       } else {
 
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
index 61a5e8c4..0e44c687 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
@@ -40,8 +40,8 @@ public class MySQLInsertParents extends MySQLTransaction implements InsertParent
   public void execute(final EntityID entity, final EntityID parent) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_ISA);
-      stmt.setInt(1, entity.toInteger());
-      stmt.setInt(2, parent.toInteger());
+      stmt.setString(1, entity.toString());
+      stmt.setString(2, parent.toString());
       stmt.execute();
     } catch (final Exception e) {
       throw new TransactionException(e);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
index 62237d3e..45924403 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java
@@ -47,7 +47,7 @@ public class MySQLInsertSparseEntity extends MySQLTransaction implements InsertS
       final PreparedStatement insertEntityStmt = prepareStatement(STMT_INSERT_SPARSE_ENTITY);
       final PreparedStatement insertFilePropsStmt = prepareStatement(STMT_INSERT_FILE_PROPERTIES);
 
-      insertEntityStmt.setInt(1, entity.id);
+      insertEntityStmt.setString(1, entity.id);
       insertEntityStmt.setString(2, entity.name);
       insertEntityStmt.setString(3, entity.description);
       insertEntityStmt.setString(4, entity.role);
@@ -62,7 +62,7 @@ public class MySQLInsertSparseEntity extends MySQLTransaction implements InsertS
       }
 
       if (entity.filePath != null) {
-        insertFilePropsStmt.setInt(1, entity.id);
+        insertFilePropsStmt.setString(1, entity.id);
         if (entity.fileHash != null) {
           insertFilePropsStmt.setString(2, entity.fileHash);
         } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
index 0832790a..155cb2d0 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
@@ -56,7 +56,7 @@ public class MySQLInsertTransactionHistory extends MySQLTransaction
       logStmt.setString(3, user);
       logStmt.setLong(4, seconds);
       logStmt.setInt(5, nanos);
-      logStmt.setInt(6, entity.toInteger());
+      logStmt.setString(6, entity.toString());
       logStmt.execute();
     } catch (final Exception e) {
       throw new TransactionException(e);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
index f6c2daf8..0d469a79 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
@@ -43,8 +43,8 @@ public class MySQLIsSubType extends MySQLTransaction implements IsSubTypeImpl {
     try {
       final PreparedStatement isSubtypeStmt = prepareStatement(STMT_IS_SUBTYPE);
 
-      isSubtypeStmt.setInt(1, child.toInteger());
-      isSubtypeStmt.setInt(2, parent.toInteger());
+      isSubtypeStmt.setString(1, child.toString());
+      isSubtypeStmt.setString(2, parent.toString());
 
       final ResultSet rs = isSubtypeStmt.executeQuery();
       try {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAllUncheckedFiles.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAllUncheckedFiles.java
index 09a4e7c2..cfbf2281 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAllUncheckedFiles.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAllUncheckedFiles.java
@@ -51,7 +51,7 @@ public class MySQLRetrieveAllUncheckedFiles extends MySQLTransaction
       final ResultSet rs = stmt.executeQuery();
       if (rs.next()) {
         final SparseEntity first = new SparseEntity();
-        first.id = rs.getInt("file_id");
+        first.id = rs.getString("file_id");
         first.filePath = rs.getString("path");
         first.fileHash = rs.getString("file_hash");
         first.fileSize = rs.getLong("size");
@@ -71,7 +71,7 @@ public class MySQLRetrieveAllUncheckedFiles extends MySQLTransaction
             try {
               if (rs.next()) {
                 this.next = new SparseEntity();
-                this.next.id = rs.getInt("file_id");
+                this.next.id = rs.getString("file_id");
                 this.next.filePath = rs.getString("path");
                 this.next.fileHash = rs.getString("file_hash");
                 this.next.fileSize = rs.getLong("size");
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveEntityACL.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveEntityACL.java
index 5db8ed75..716b7ff6 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveEntityACL.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveEntityACL.java
@@ -39,9 +39,9 @@ public class MySQLRetrieveEntityACL extends MySQLTransaction implements Retrieve
       "SELECT a.acl FROM entities AS e LEFT JOIN entity_acl AS a ON (a.id = e.acl) WHERE e.id = ? LIMIT 1";
 
   @Override
-  public VerySparseEntity execute(Integer id) {
+  public VerySparseEntity execute(String id) {
     try (PreparedStatement stmt = prepareStatement(STMT)) {
-      stmt.setInt(1, id);
+      stmt.setString(1, id);
       ResultSet rs = stmt.executeQuery();
       if (rs.next()) {
         VerySparseEntity result = new VerySparseEntity();
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
index 1e2a6621..6f48e755 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
@@ -49,7 +49,7 @@ public class MySQLRetrieveParents extends MySQLTransaction implements RetrievePa
       try {
         final PreparedStatement prepareStatement = prepareStatement(stmtStr);
 
-        prepareStatement.setInt(1, id.toInteger());
+        prepareStatement.setString(1, id.toString());
         if (version == null) {
           prepareStatement.setNull(2, Types.VARBINARY);
         } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
index 100df4ce..546b5675 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
@@ -50,12 +50,12 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
       final PreparedStatement prepareStatement = prepareStatement(stmtStr);
 
       final List<ProtoProperty> propsStage1 =
-          retrieveFlatPropertiesStage1(0, entity.toInteger(), version, prepareStatement);
+          retrieveFlatPropertiesStage1("0", entity.toString(), version, prepareStatement);
 
       for (final ProtoProperty p : propsStage1) {
 
         p.subProperties =
-            retrieveFlatPropertiesStage1(entity.toInteger(), p.id, version, prepareStatement);
+            retrieveFlatPropertiesStage1(entity.toString(), p.id, version, prepareStatement);
       }
       return DatabaseUtils.transformToDeepPropertyTree(propsStage1, isHead);
     } catch (final SQLException e) {
@@ -66,18 +66,11 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
   }
 
   private List<ProtoProperty> retrieveFlatPropertiesStage1(
-      final Integer domain,
-      final Integer entity,
-      final String version,
-      final PreparedStatement stmt)
+      final String domain, final String entity, final String version, final PreparedStatement stmt)
       throws SQLException, ConnectionException {
-    if (domain != null && domain >= 0) {
-      stmt.setInt(1, domain);
-    } else {
-      stmt.setInt(1, 0);
-    }
 
-    stmt.setInt(2, entity);
+    stmt.setString(1, domain);
+    stmt.setString(2, entity);
     if (version == null) {
       stmt.setNull(3, Types.VARBINARY);
     } else {
@@ -94,15 +87,17 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
 
       final PreparedStatement retrieveOverrides = prepareStatement(stmtStr2);
 
-      retrieveOverrides(domain, entity, version, retrieveOverrides, properties);
+      if (properties != null & !properties.isEmpty()) {
+        retrieveOverrides(domain, entity, version, retrieveOverrides, properties);
+      }
 
       return properties;
     }
   }
 
   private void retrieveOverrides(
-      final Integer domain,
-      final Integer entity,
+      final String domain,
+      final String entity,
       final String version,
       final PreparedStatement retrieveOverrides,
       final List<ProtoProperty> props)
@@ -110,8 +105,8 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
 
     ResultSet rs = null;
     try {
-      retrieveOverrides.setInt(1, domain);
-      retrieveOverrides.setInt(2, entity);
+      retrieveOverrides.setString(1, domain);
+      retrieveOverrides.setString(2, entity);
       if (version == null) {
         retrieveOverrides.setNull(3, Types.VARBINARY);
       } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
index 1ab95ae7..5e96353a 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
@@ -46,7 +46,7 @@ public class MySQLRetrieveQueryTemplateDefinition extends MySQLTransaction
     try {
 
       final PreparedStatement stmt = prepareStatement(STMT_RETRIEVE_QUERY_TEMPLATE_DEF);
-      stmt.setInt(1, id.toInteger());
+      stmt.setString(1, id.toString());
       if (version == null) {
         stmt.setNull(2, Types.VARBINARY);
       } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
index 48cd84b3..c4a9b626 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
@@ -51,7 +51,7 @@ public class MySQLRetrieveSparseEntity extends MySQLTransaction
     try {
       final PreparedStatement preparedStatement = prepareStatement(stmtStr);
 
-      preparedStatement.setInt(1, id.toInteger());
+      preparedStatement.setString(1, id.toString());
       if (version == null) {
         preparedStatement.setNull(2, Types.VARBINARY);
       } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
index 6c4c2629..9493b382 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
@@ -53,7 +53,7 @@ public class MySQLRetrieveVersionHistory extends MySQLTransaction
     final HashMap<String, VersionHistoryItem> result = new HashMap<>();
     try {
       final PreparedStatement s = prepareStatement(VERSION_HISTORY_STMT);
-      s.setInt(1, entityId.toInteger());
+      s.setString(1, entityId.toString());
       final ResultSet rs = s.executeQuery();
 
       while (rs.next()) {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
index 18d7d9b7..b08d0517 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
@@ -43,7 +43,7 @@ public class MySQLSetFileCheckedTimestampImpl extends MySQLTransaction
     try {
       final PreparedStatement stmt = getMySQLHelper().prepareStatement(STMT_SET_TS);
       stmt.setLong(1, ts);
-      stmt.setInt(2, id.toInteger());
+      stmt.setString(2, id.toString());
     } catch (final SQLException e) {
       throw new TransactionException(e);
     } catch (final ConnectionException e) {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java
index c9b51f7a..69ecfba5 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileChecksum.java
@@ -25,7 +25,7 @@ public class MySQLSetFileChecksum extends MySQLTransaction implements SetFileChe
   public void execute(final EntityID id, final String checksum) {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_SET_CHECKSUM);
-      stmt.setInt(2, id.toInteger());
+      stmt.setString(2, id.toString());
       stmt.setString(1, checksum);
       stmt.execute();
     } catch (SQLException | ConnectionException e) {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
index 02ebdd36..b03630f5 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
@@ -43,7 +43,7 @@ public class MySQLSetQueryTemplateDefinition extends MySQLTransaction
   public void insert(final EntityID id, final String definition) {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_QUERY_TEMPLATE_DEF);
-      stmt.setInt(1, id.toInteger());
+      stmt.setString(1, id.toString());
       stmt.setString(2, definition);
       stmt.setString(3, definition);
       stmt.execute();
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
index b2d0fb9e..8d2af662 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
@@ -47,7 +47,7 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS
     try {
       // file properties;
       final PreparedStatement updateFilePropsStmt = prepareStatement(STMT_UPDATE_FILE_PROPS);
-      updateFilePropsStmt.setInt(1, spe.id);
+      updateFilePropsStmt.setString(1, spe.id);
       if (spe.filePath != null) {
         updateFilePropsStmt.setString(2, spe.filePath);
         updateFilePropsStmt.setLong(3, spe.fileSize);
@@ -65,7 +65,7 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS
 
       // very sparse entity
       final PreparedStatement updateEntityStmt = prepareStatement(STMT_UPDATE_ENTITY);
-      updateEntityStmt.setInt(1, spe.id);
+      updateEntityStmt.setString(1, spe.id);
       updateEntityStmt.setString(2, spe.name);
       updateEntityStmt.setString(3, spe.description);
       updateEntityStmt.setString(4, spe.role);
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
index 230d4d34..cc614619 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
@@ -25,5 +25,5 @@ import org.caosdb.server.database.proto.VerySparseEntity;
 
 public interface RetrieveEntityACLImpl extends BackendTransactionImpl {
 
-  public VerySparseEntity execute(Integer id);
+  public VerySparseEntity execute(String id);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
index 8ef143b4..00f8c510 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
@@ -43,7 +43,7 @@ public class RetrieveEntityACLTransaction
   @Override
   public VerySparseEntity executeNoCache() throws TransactionException {
     RetrieveEntityACLImpl t = getImplementation(RetrieveEntityACLImpl.class);
-    return t.execute(getKey().toInteger());
+    return t.execute(getKey().toString());
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
index b92d3def..b2123ce2 100644
--- a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
+++ b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
@@ -27,7 +27,7 @@ import java.io.Serializable;
 public class FlatProperty implements Serializable {
 
   private static final long serialVersionUID = 6039288034435124195L;
-  public Integer id = null;
+  public String id = null;
   public String value = null;
   public String status = null;
   public Integer idx = null;
diff --git a/src/main/java/org/caosdb/server/database/proto/VerySparseEntity.java b/src/main/java/org/caosdb/server/database/proto/VerySparseEntity.java
index 8f32bf52..5ceca456 100644
--- a/src/main/java/org/caosdb/server/database/proto/VerySparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/proto/VerySparseEntity.java
@@ -35,7 +35,7 @@ public class VerySparseEntity implements Serializable {
 
   private static final long serialVersionUID = 7370925076064714740L;
 
-  public Integer id = null;
+  public String id = null;
   public String name = null;
   public String description = null;
   public String role = null;
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index f271e627..19934568 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -349,7 +349,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
   @Override
   public SparseEntity getSparseEntity() {
     final SparseEntity ret = new SparseEntity();
-    ret.id = getId().toInteger();
+    ret.id = getId().toString();
     ret.name = getName();
     ret.description = getDescription();
     ret.acl = getEntityACL().serialize();
@@ -647,7 +647,9 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     // Parse ID. Generate error if it isn't an integer.
     if (element.getAttribute("id") != null && !element.getAttributeValue("id").equals("")) {
       try {
-        this.getId().setId(Integer.parseInt(element.getAttributeValue("id")));
+        // check is integer compatible
+        Integer.parseInt(element.getAttributeValue("id"));
+        this.getId().setId(element.getAttributeValue("id"));
       } catch (final NumberFormatException e) {
         addInfo("Id was " + element.getAttributeValue("id") + ".");
         addError(ServerMessages.PARSING_FAILED);
diff --git a/src/main/java/org/caosdb/server/entity/EntityID.java b/src/main/java/org/caosdb/server/entity/EntityID.java
index 6a2d2ca3..f1a13769 100644
--- a/src/main/java/org/caosdb/server/entity/EntityID.java
+++ b/src/main/java/org/caosdb/server/entity/EntityID.java
@@ -14,36 +14,36 @@ import java.util.Objects;
  */
 public class EntityID implements Serializable {
 
-  private static final long serialVersionUID = -9092133023135548179L;
+  private static final long serialVersionUID = -9062285447437546105L;
 
-  public static final EntityID DEFAULT_DOMAIN = new EntityID(0);
-  private Integer i = null;
+  public static final EntityID DEFAULT_DOMAIN = new EntityID("0");
+  private String id = null;
   private EntityID link = null;
 
   public EntityID() {}
 
-  public EntityID(final Integer id) {
-    this.i = id;
+  public EntityID(final int id) {
+    this(Integer.toString(id));
   }
 
-  public void setId(final Integer i) {
-    this.i = i;
+  public EntityID(final String id) {
+    this.id = id.toString();
   }
 
-  public Integer toInteger() {
-    if (this.link != null) {
-      return this.link.toInteger();
-    }
-    return this.i;
+  public void setId(final String id) {
+    this.id = id;
   }
 
   @Override
   public String toString() {
-    return toInteger().toString();
+    if (this.link != null) {
+      return this.link.toString();
+    }
+    return this.id;
   }
 
   boolean hasId() {
-    return this.i != null || this.link != null && this.link.hasId();
+    return this.id != null || this.link != null && this.link.hasId();
   }
 
   public void link(final EntityInterface entity) {
@@ -57,7 +57,7 @@ public class EntityID implements Serializable {
   @Override
   public boolean equals(final Object obj) {
     if (obj instanceof EntityID) {
-      return Objects.equals(((EntityID) obj).toInteger(), this.toInteger());
+      return Objects.equals(((EntityID) obj).toString(), this.toString());
     }
     return false;
   }
@@ -65,16 +65,20 @@ public class EntityID implements Serializable {
   @Override
   public int hashCode() {
     if (this.hasId()) {
-      return toInteger();
+      return toString().hashCode();
     }
     return super.hashCode();
   }
 
   public boolean isTemporary() {
-    return toInteger() < 0;
+    return toString().startsWith("-");
   }
 
   public static boolean isReserved(final EntityID id) {
-    return id.toInteger() < 100;
+    try {
+      return id.hasId() && Integer.parseInt(id.toString()) < 100;
+    } catch (NumberFormatException e) {
+      return false;
+    }
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/EntityIdRegistry.java b/src/main/java/org/caosdb/server/entity/EntityIdRegistry.java
index a870f03c..6ab18d15 100644
--- a/src/main/java/org/caosdb/server/entity/EntityIdRegistry.java
+++ b/src/main/java/org/caosdb/server/entity/EntityIdRegistry.java
@@ -41,11 +41,11 @@ public class EntityIdRegistry {
                 .getCurrentMaxId());
   }
 
-  public Integer generate() {
+  public String generate() {
     if (!isInit) {
       init();
     }
     ++currentMaxId;
-    return ++currentMaxId;
+    return Integer.toString(++currentMaxId);
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/MagicTypes.java b/src/main/java/org/caosdb/server/entity/MagicTypes.java
index 39556385..e132ddc0 100644
--- a/src/main/java/org/caosdb/server/entity/MagicTypes.java
+++ b/src/main/java/org/caosdb/server/entity/MagicTypes.java
@@ -51,12 +51,12 @@ public enum MagicTypes {
   }
 
   public static MagicTypes getType(final EntityID id) {
-    switch (id.toInteger()) {
-      case 21:
+    switch (id.toString()) {
+      case "21":
         return UNIT;
-      case 20:
+      case "20":
         return NAME;
-      case 24:
+      case "24":
         return DESCRIPTION;
       default:
         return null;
diff --git a/src/main/java/org/caosdb/server/jobs/core/EntityIdHandler.java b/src/main/java/org/caosdb/server/jobs/core/EntityIdHandler.java
index d555bf95..bd4d4b80 100644
--- a/src/main/java/org/caosdb/server/jobs/core/EntityIdHandler.java
+++ b/src/main/java/org/caosdb/server/jobs/core/EntityIdHandler.java
@@ -18,7 +18,7 @@ public class EntityIdHandler extends EntityJob {
     if (entity instanceof InsertEntity
         && getTransaction() instanceof WriteTransactionInterface
         && entity.getEntityStatus() == EntityStatus.QUALIFIED) {
-      Integer id = ((WriteTransactionInterface) getTransaction()).generateId();
+      String id = ((WriteTransactionInterface) getTransaction()).generateId();
       entity.getId().setId(id);
     }
   }
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 5966a135..ad3fb778 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -424,7 +424,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
       // Run thru all QTs found...
       for (final Entry<EntityID, String> q : queryTemplates.entrySet()) {
         // ... remove the QT from resultSet...
-        removeQTStmt.setInt(1, q.getKey().toInteger());
+        removeQTStmt.setString(1, q.getKey().toString());
         removeQTStmt.execute();
 
         // ... check for RETRIEVE:ENTITY permission...
diff --git a/src/main/java/org/caosdb/server/transaction/UpdateACL.java b/src/main/java/org/caosdb/server/transaction/UpdateACL.java
index 3da0b572..289b5d53 100644
--- a/src/main/java/org/caosdb/server/transaction/UpdateACL.java
+++ b/src/main/java/org/caosdb/server/transaction/UpdateACL.java
@@ -145,7 +145,7 @@ public class UpdateACL extends Transaction<TransactionContainer>
   }
 
   @Override
-  public Integer generateId() {
+  public String generateId() {
     throw new UnsupportedOperationException(
         "This is not implemented on purpose. This exception indicates a usage error of this UpdateACL class.");
   }
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
index 0bc4f4e3..87d29947 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -597,7 +597,7 @@ public class WriteTransaction extends Transaction<WritableContainer>
   }
 
   @Override
-  public Integer generateId() {
+  public String generateId() {
     if (this.idRegistry == null) {
       this.idRegistry = new EntityIdRegistry(this);
     }
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransactionInterface.java b/src/main/java/org/caosdb/server/transaction/WriteTransactionInterface.java
index e635c0c5..c39d2c14 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransactionInterface.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransactionInterface.java
@@ -11,5 +11,5 @@ public interface WriteTransactionInterface extends TransactionInterface {
 
   public String getSRID();
 
-  public Integer generateId();
+  public String generateId();
 }
diff --git a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
index 03bd185c..94febb12 100644
--- a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
+++ b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
@@ -143,31 +143,31 @@ public class InsertTest {
 
     assertEquals(7, stage1Inserts.size());
     assertFalse(stage1Inserts.get(0) instanceof Replacement);
-    assertEquals(1, stage1Inserts.get(0).getId().toInteger());
+    assertEquals("1", stage1Inserts.get(0).getId().toString());
     assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString());
 
     assertFalse(stage1Inserts.get(1) instanceof Replacement);
-    assertEquals(2, stage1Inserts.get(1).getId().toInteger());
+    assertEquals("2", stage1Inserts.get(1).getId().toString());
     assertEquals("V2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString());
 
     assertFalse(stage1Inserts.get(2) instanceof Replacement);
-    assertEquals(4, stage1Inserts.get(2).getId().toInteger());
+    assertEquals("4", stage1Inserts.get(2).getId().toString());
     assertEquals("V4", ((SingleValue) stage1Inserts.get(2).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(3) instanceof Replacement);
-    assertEquals(-1, stage1Inserts.get(3).getId().toInteger());
+    assertEquals("-1", stage1Inserts.get(3).getId().toString());
     assertEquals("V5", ((SingleValue) stage1Inserts.get(3).getValue()).toDatabaseString());
 
     assertFalse(stage1Inserts.get(4) instanceof Replacement);
-    assertEquals(7, stage1Inserts.get(4).getId().toInteger());
+    assertEquals("7", stage1Inserts.get(4).getId().toString());
     assertEquals("V7", ((SingleValue) stage1Inserts.get(4).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(5) instanceof Replacement);
-    assertEquals(-2, stage1Inserts.get(5).getId().toInteger());
+    assertEquals("-2", stage1Inserts.get(5).getId().toString());
     assertEquals("V8", ((SingleValue) stage1Inserts.get(5).getValue()).toDatabaseString());
 
     assertTrue(stage1Inserts.get(6) instanceof Replacement);
-    assertEquals(-3, stage1Inserts.get(6).getId().toInteger());
+    assertEquals("-3", stage1Inserts.get(6).getId().toString());
     assertEquals("V9", ((SingleValue) stage1Inserts.get(6).getValue()).toDatabaseString());
 
     assertEquals(6, stage2Inserts.size());
@@ -300,7 +300,7 @@ public class InsertTest {
 
     assertFalse(stage1Inserts.get(1) instanceof Replacement);
     assertEquals(new EntityID(-1), stage1Inserts.get(1).getId());
-    assertEquals(1, ((ReferenceValue) stage1Inserts.get(1).getValue()).getId().toInteger());
+    assertEquals("1", ((ReferenceValue) stage1Inserts.get(1).getValue()).getId().toString());
 
     assertFalse(stage1Inserts.get(2) instanceof Replacement);
     assertEquals(new EntityID(1), stage1Inserts.get(2).getId());
@@ -368,7 +368,7 @@ public class InsertTest {
 
     assertFalse(stage1Inserts.get(2) instanceof Replacement);
     assertEquals(new EntityID(-1), stage1Inserts.get(2).getId());
-    assertEquals(2, ((ReferenceValue) stage1Inserts.get(2).getValue()).getId().toInteger());
+    assertEquals("2", ((ReferenceValue) stage1Inserts.get(2).getValue()).getId().toString());
 
     assertFalse(stage1Inserts.get(3) instanceof Replacement);
     assertEquals(new EntityID(3), stage1Inserts.get(3).getId());
-- 
GitLab