diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml
index cd5c809af1f872239d234c8f1e6cba56f25a95fb..0b244a12a46ec7d9ec25ba86fd01c9f2d5b97d5f 100644
--- a/dbrepo-data-service/pom.xml
+++ b/dbrepo-data-service/pom.xml
@@ -23,7 +23,7 @@
         <module>report</module>
     </modules>
 
-    <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/</url>
+    <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/</url>
     <developers>
         <developer>
             <name>Martin Weise</name>
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
index f656ba84bb8eb52d46301ba40fabeb68c060db44..a2fb1264cc360f0de0d5502306b215d79a442a70 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java
@@ -21,12 +21,11 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @AllArgsConstructor
 @NoArgsConstructor
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_containers")
 public class Container {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -55,7 +54,7 @@ public class Container {
     @Column
     private String uiAdditionalFlags;
 
-    @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false)
@@ -68,11 +67,13 @@ public class Container {
     })
     private ContainerImage image;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
index fbd4e44e8e5d3e9639cacb99acb5d55f5b045f61..7e04ce2086c3b4e9e677548b106cc28ddc9756ee 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java
@@ -20,7 +20,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @AllArgsConstructor
 @NoArgsConstructor
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_images", uniqueConstraints = @UniqueConstraint(columnNames = {"name", "version"}))
 @NamedQueries({
         @NamedQuery(name = "ContainerImage.findAll", query = "select i from ContainerImage i order by i.id asc")
@@ -28,7 +28,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class ContainerImage {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     public Long id;
@@ -61,11 +60,13 @@ public class ContainerImage {
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "image")
     private List<Container> containers;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
index 93759ed5cbfb6a1de6789de943036b457f7e63f7..5f4ddbfb8c6dd8a657a88432d4606fa6f9c56f7e 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java
@@ -13,12 +13,11 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @AllArgsConstructor
 @NoArgsConstructor
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_image_types")
 public class DataType {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     public Long id;
@@ -69,6 +68,7 @@ public class DataType {
     private Boolean buildable;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "image_id", referencedColumnName = "id")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
index ae01dbee2f2a22dc40712b0fff2f8ac7e16adbc6..bbd994fa7ec05d775ba8a7c2eebb1ece418d2726 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java
@@ -13,12 +13,11 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @AllArgsConstructor
 @NoArgsConstructor
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_image_operators")
 public class Operator {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     public Long id;
@@ -33,6 +32,7 @@ public class Operator {
     private String documentation;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "image_id", referencedColumnName = "id")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
index e54b097bd045ae550a594e3b0585fa2fec110c96..f70fbd93a31d7566e878fd11f31945bc73689c49 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
@@ -26,6 +26,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @jakarta.persistence.Table(name = "mdb_databases", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"cid", "internalName"})
@@ -43,12 +44,10 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class Database implements Serializable {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
 
-    @ToString.Exclude
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "owned_by", columnDefinition = "VARCHAR(36)")
     private UUID ownedBy;
@@ -62,6 +61,7 @@ public class Database implements Serializable {
     @Column(nullable = false)
     private Long cid;
 
+    @ToString.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false)
@@ -80,7 +80,6 @@ public class Database implements Serializable {
     @Column(columnDefinition = "TEXT")
     private String description;
 
-    @ToString.Exclude
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "contact_person", columnDefinition = "VARCHAR(36)")
     private UUID contactPerson;
@@ -91,29 +90,24 @@ public class Database implements Serializable {
     })
     private User contact;
 
-    @ToString.Exclude
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database")
     @Where(clause = "identifier_type='DATABASE'")
     @OrderBy("id DESC")
     private List<Identifier> identifiers;
 
-    @ToString.Exclude
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database")
     @Where(clause = "identifier_type='SUBSET'")
     @OrderBy("id DESC")
     private List<Identifier> subsets;
 
-    @ToString.Exclude
     @OrderBy("id DESC")
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true)
     private List<Table> tables;
 
-    @ToString.Exclude
     @OrderBy("id DESC")
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true)
     private List<View> views;
 
-    @ToString.Exclude
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true)
     private List<DatabaseAccess> accesses;
 
@@ -128,11 +122,13 @@ public class Database implements Serializable {
     @Column(columnDefinition = "LONGBLOB")
     private byte[] image;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
index eeb9da55fef08b16b743d3afe06ef1ea9b4ab5bc..079aac84c7d191f71d29657c6837a6ae9f545bab 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java
@@ -17,7 +17,7 @@ import java.util.UUID;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @IdClass(DatabaseAccessKey.class)
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_have_access")
@@ -28,7 +28,6 @@ import java.util.UUID;
 public class DatabaseAccess {
 
     @Id
-    @EqualsAndHashCode.Include
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "user_id", updatable = false, columnDefinition = "VARCHAR(36)")
     private UUID huserid;
@@ -42,11 +41,11 @@ public class DatabaseAccess {
     private User user;
 
     @Id
-    @EqualsAndHashCode.Include
     @Column(name = "database_id", updatable = false)
     private Long hdbid;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -58,9 +57,4 @@ public class DatabaseAccess {
     @Column(nullable = false, name = "access_type", columnDefinition = "enum('READ', 'WRITE_OWN', 'WRITE_ALL')")
     private AccessType type;
 
-    @CreatedDate
-    @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
 }
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
index ae12208ad8e7f66e00a7c73ce59ae1cd18ef343f..67e6d6d18ac26a1cb2641ed45ae9e969c7393164 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -25,6 +25,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_view")
 @NamedQueries({
@@ -37,7 +38,6 @@ public class View {
 
     @Id
     @org.springframework.data.annotation.Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -89,6 +89,7 @@ public class View {
     private List<Identifier> identifiers;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -102,11 +103,13 @@ public class View {
     @OrderBy("ordinalPosition")
     private List<ViewColumn> columns;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
index ef1372f3bc7339c694c42c4b3aed0d7010c9193f..7ef6e8b9d63c30e05313514c78ad562306318185 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
@@ -13,7 +13,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"view_id", "internal_name"})
@@ -21,12 +21,12 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class ViewColumn implements Comparable<ViewColumn> {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "view_id", referencedColumnName = "id", nullable = false)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
index 921a873c44e935a3b89459c8d9bb20c44df4dc84..3cdb01d7d38477cc8a77b4e12ed9af61d04ecfba 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
@@ -30,7 +30,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @jakarta.persistence.Table(name = "mdb_tables", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"tdbid", "internalName"})
@@ -38,7 +38,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class Table {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(name = "ID", updatable = false, nullable = false)
     private Long id;
@@ -70,6 +69,7 @@ public class Table {
     private String description;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
@@ -88,7 +88,6 @@ public class Table {
     @OrderBy("id DESC")
     private List<Identifier> identifiers;
 
-    @ToString.Exclude
     @Embedded
     private Constraints constraints;
 
@@ -113,17 +112,18 @@ public class Table {
     @Column(name = "avg_row_length")
     private Long avgRowLength;
 
-    @ToString.Exclude
     @OnDelete(action = OnDeleteAction.CASCADE)
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "table")
     @OrderBy("ordinalPosition")
     private List<TableColumn> columns;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
index 32e3b46c5dedd265ffcf363480dc3baa20005692..9f4c4e0606802a475e5873e3d0ebc57455a6a0e2 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
@@ -20,7 +20,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @jakarta.persistence.Table(name = "mdb_columns", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"tID", "internal_name"})
@@ -31,12 +31,12 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class TableColumn implements Comparable<TableColumn> {
 
     @Id
-    @EqualsAndHashCode.Include
-    @GeneratedValue(strategy=IDENTITY)
+    @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "tID", referencedColumnName = "id", nullable = false)
@@ -71,11 +71,6 @@ public class TableColumn implements Comparable<TableColumn> {
     @Column(nullable = false)
     private Integer ordinalPosition;
 
-    @CreatedDate
-    @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
     @JoinTable(name = "mdb_columns_concepts",
             joinColumns = @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false),
@@ -119,6 +114,13 @@ public class TableColumn implements Comparable<TableColumn> {
     @Column(name = "std_dev")
     private BigDecimal stdDev;
 
+    @EqualsAndHashCode.Exclude
+    @CreatedDate
+    @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
+    private Instant created;
+
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
index 0283b10cd0a0066d7573e3e4d0a579cffad3e1b9..5a9e8292be0af3e99050bc87be1ba7b8b9756bf7 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java
@@ -18,7 +18,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @NoArgsConstructor
 @ToString
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_concepts", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"uri"})
 })
@@ -29,7 +29,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class TableColumnConcept {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -43,6 +42,7 @@ public class TableColumnConcept {
     @Column(columnDefinition = "TEXT")
     private String description;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
index def2a78e0814d21a768b3e62a62f3576f4adb5c4..7e8fe915b3b9de49e53eb0806da1f5ed03608a1d 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java
@@ -18,7 +18,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @AllArgsConstructor
 @NoArgsConstructor
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_units", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"uri"})
 })
@@ -29,7 +29,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class TableColumnUnit {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -43,6 +42,7 @@ public class TableColumnUnit {
     @Column(columnDefinition = "TEXT")
     private String description;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
index 69dad3d01ce6eb557588c5d7f9472828ff65c712..76de9463cfa37048fb45d2b091b472190124ff1b 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java
@@ -16,12 +16,11 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @NoArgsConstructor
 @ToString
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @jakarta.persistence.Table(name = "mdb_constraints_foreign_key")
 public class ForeignKey {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(name = "fkid", updatable = false, nullable = false)
     private Long id;
@@ -30,6 +29,7 @@ public class ForeignKey {
     private String name;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false)
@@ -37,6 +37,7 @@ public class ForeignKey {
     private Table table;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
     @JoinColumns({
             @JoinColumn(name = "rtid", referencedColumnName = "id", nullable = false)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
index 0ec2a3393d2fdb539b8207d9fe94fc3f8002b93c..ed2691fc524a3de33788ed977b1ba213b18b5bfe 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
@@ -14,19 +14,19 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @NoArgsConstructor
 @ToString
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @Table(name = "mdb_constraints_foreign_key_reference", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"fkid", "cid", "rcid"})
 })
 public class ForeignKeyReference {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
     private ForeignKey foreignKey;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
index 84d8cb75d7f68a0ea5f9e5336e477e19b00fd076..407e2fb7f3f98b6a8b65d28636c92afaceb3e69c 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java
@@ -15,17 +15,17 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @NoArgsConstructor
 @ToString
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @jakarta.persistence.Table(name = "mdb_constraints_primary_key")
 public class PrimaryKey {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(name = "pkid", updatable = false, nullable = false)
     private Long id;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
@@ -34,6 +34,7 @@ public class PrimaryKey {
     private Table table;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
index f8517dda17367172072392ba65db1a5e0f08b8c0..c0dfc467109cf794dda89925393b442286254da5 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java
@@ -17,12 +17,11 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @NoArgsConstructor
 @ToString
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @jakarta.persistence.Table(name = "mdb_constraints_unique")
 public class Unique {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(name = "uid", updatable = false, nullable = false)
     private Long id;
@@ -31,6 +30,7 @@ public class Unique {
     private String name;
 
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
@@ -38,6 +38,7 @@ public class Unique {
     })
     private Table table;
 
+    @EqualsAndHashCode.Exclude
     @org.springframework.data.annotation.Transient
     @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinTable(
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java
index 9ec7dca46891e7ae7d99134977d44b67a23a5679..1b0692ae50adf8d6ca280a5403908cb3e8d65f42 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java
@@ -12,13 +12,13 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_identifier_creators")
 public class Creator {
 
     @Id
     @org.springframework.data.annotation.Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
index db34a5aca526b0ca009946f677811e9d175bd6ec..b98a1b8c6b7509ef0772f69e2af343b1b63d386e 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
@@ -25,7 +25,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_identifiers")
 @NamedQueries({
@@ -39,7 +39,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class Identifier implements Serializable {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -139,6 +138,7 @@ public class Identifier implements Serializable {
      * Databases are never created/updated/deleted by the Identifier entity.
      */
     @ToString.Exclude
+    @EqualsAndHashCode.Exclude
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "dbid", referencedColumnName = "id", nullable = false, updatable = false)
@@ -166,10 +166,12 @@ public class Identifier implements Serializable {
     })
     private User owner;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java
index 83e123e90dc83d28dff6d471f99a624b4a278479..af684d2347b20bd54a959040b7b07937fc69952f 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java
@@ -15,13 +15,13 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_identifier_descriptions")
 public class IdentifierDescription implements Serializable {
 
     @Id
     @org.springframework.data.annotation.Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java
index 56372bdb6382562f45154ba430bfe593e19d3ee6..c5720223467f5e52ac54354c11dc21baf36fcd0d 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java
@@ -14,12 +14,12 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_identifier_funders")
 public class IdentifierFunder implements Serializable {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java
index ea1c17bc92765ad0659eafd5aebe5a10108778fd..cecc2c5c9804114529be0c6543de1ea69f5668aa 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java
@@ -15,12 +15,12 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_identifier_titles")
 public class IdentifierTitle implements Serializable {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java
index b09c7afc36e7466734f6c1fd923a46081d9d4b13..e8b1acde125265bdda9d94918daf0bf478ff4904 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java
@@ -12,7 +12,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_related_identifiers", uniqueConstraints = {
         @UniqueConstraint(columnNames = {"id", "pid"})
@@ -20,7 +20,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class RelatedIdentifier {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java
index 94cb08490ab47930894d79431501cee1f3a0324f..f22cee71a7a3dc4a97c8294619b5ec8931db1714 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java
@@ -14,6 +14,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_banner_messages")
 @NamedQueries({
@@ -22,7 +23,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class BannerMessage {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
index 28451838c654fc0009e7d99b5f1266da051feea5..576aab1e375028a9a776ae96cb0ea983f84e7274 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java
@@ -16,6 +16,7 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 @ToString
 @AllArgsConstructor
 @NoArgsConstructor
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
 @Table(name = "mdb_ontologies")
 @NamedQueries({
@@ -26,7 +27,6 @@ import static jakarta.persistence.GenerationType.IDENTITY;
 public class Ontology {
 
     @Id
-    @EqualsAndHashCode.Include
     @GeneratedValue(strategy = IDENTITY)
     @Column(updatable = false, nullable = false)
     private Long id;
@@ -46,10 +46,12 @@ public class Ontology {
     @Column
     private String rdfPath;
 
+    @EqualsAndHashCode.Exclude
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP")
     private Instant created;
 
+    @EqualsAndHashCode.Exclude
     @LastModifiedDate
     @Column(columnDefinition = "TIMESTAMP")
     private Instant lastModified;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
index 2d6ac4ccbee653e28cc25c5b78bbedeb89b1652f..c732864969c23bf45e4c616bd0c154703615d286 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java
@@ -15,16 +15,15 @@ import java.util.UUID;
 @Data
 @Entity
 @Builder
+@ToString
 @AllArgsConstructor
 @NoArgsConstructor
-@ToString
+@EqualsAndHashCode
 @EntityListeners(AuditingEntityListener.class)
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
 @Table(name = "mdb_users")
 public class User {
 
     @Id
-    @EqualsAndHashCode.Include
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)")
     private UUID id;
@@ -50,7 +49,6 @@ public class User {
     @Column
     private String language;
 
-    @ToString.Exclude
     @OneToMany(fetch = FetchType.LAZY)
     @JoinColumns({
             @JoinColumn(name = "user_id", referencedColumnName = "ID", insertable = false, updatable = false)
@@ -60,43 +58,7 @@ public class User {
     @Column(nullable = false)
     private String theme;
 
-    @ToString.Exclude
     @Column(name = "mariadb_password", nullable = false)
     private String mariadbPassword;
 
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (o instanceof Principal principal) {
-            final boolean result = this.getUsername().equals(principal.getName());
-            log.trace("check if username {} equals principal name {}: {}", username, principal.getName(), result);
-            return result;
-        }
-        if (!(o instanceof User other)) {
-            return false;
-        }
-        final boolean result = this.getId().equals(other.getId());
-        log.trace("check if id {} equals other id {}: {}", id, other.getId(), result);
-        return result;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 7;
-        hash = 31 * hash + (id == null ? 0 : id.hashCode());
-        hash = 31 * hash + (username == null ? 0 : username.hashCode());
-        hash = 31 * hash + (firstname == null ? 0 : firstname.hashCode());
-        hash = 31 * hash + (lastname == null ? 0 : lastname.hashCode());
-        hash = 31 * hash + (email == null ? 0 : email.hashCode());
-        hash = 31 * hash + (orcid == null ? 0 : orcid.hashCode());
-        hash = 31 * hash + (affiliation == null ? 0 : affiliation.hashCode());
-        hash = 31 * hash + (language == null ? 0 : language.hashCode());
-        hash = 31 * hash + (accesses == null ? 0 : accesses.hashCode());
-        hash = 31 * hash + (theme == null ? 0 : theme.hashCode());
-        hash = 31 * hash + (mariadbPassword == null ? 0 : mariadbPassword.hashCode());
-        return hash;
-    }
-
 }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index f0e2aaeaa1c046aa582d6ea97931fa5c706dcf2d..29c27074d77253c5cecd6e4ea67afb07954e3bed 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -213,7 +213,7 @@ public class DatabaseEndpoint {
         log.debug("endpoint refresh database metadata, databaseId={}", databaseId);
         final Database database = databaseService.findById(databaseId);
         final User caller = userService.findByUsername(principal.getName());
-        if (!database.getOwner().equals(principal)) {
+        if (!database.getOwner().getId().equals(caller.getId())) {
             log.error("Failed to refresh database tables metadata: not owner");
             throw new NotAllowedException("Failed to refresh tables metadata: not owner");
         }
@@ -259,10 +259,10 @@ public class DatabaseEndpoint {
                                                            @NotNull Principal principal) throws DataServiceException,
             DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException,
             SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, ViewNotFoundException {
-        log.debug("endpoint refresh database metadata, databaseId={}", databaseId);
+        log.debug("endpoint refresh database metadata, databaseId={}, principal.name={}", databaseId, principal.getName());
         final Database database = databaseService.findById(databaseId);
         final User caller = userService.findByUsername(principal.getName());
-        if (!database.getOwner().equals(principal)) {
+        if (!database.getOwner().getId().equals(caller.getId())) {
             log.error("Failed to refresh database views metadata: not owner");
             throw new NotAllowedException("Failed to refresh database views metadata: not owner");
         }
@@ -429,7 +429,7 @@ public class DatabaseEndpoint {
         log.debug("endpoint modify database image, databaseId={}, data.key={}", databaseId, data.getKey());
         final Database database = databaseService.findById(databaseId);
         final User caller = userService.findByUsername(principal.getName());
-        if (!database.getOwner().equals(caller)) {
+        if (!database.getOwner().getId().equals(caller.getId())) {
             log.error("Failed to update database image: not owner");
             throw new NotAllowedException("Failed to update database image: not owner");
         }
@@ -510,7 +510,7 @@ public class DatabaseEndpoint {
             caller = null;
         }
         final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller);
-        if (database.getOwner().equals(principal)) {
+        if (caller != null && database.getOwner().getId().equals(caller.getId())) {
             log.debug("current logged-in user is also the owner: additionally load access list");
             /* only owner sees the access rights */
             final List<DatabaseAccess> accesses = accessService.list(database);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
index 886db20df0d917f36e13e7f36c669259a0b5c4d5..fbfd40e6289ef20d20ae2ade97b08b9e47f96d96 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
@@ -18,7 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
@@ -97,9 +100,8 @@ public class MetadataEndpoint {
             log.error("Failed to get record: Identifier is empty");
             return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                     .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH));
-        } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix))
-                || parameters.getIdentifier().indexOf(':') > 3) {
-            log.error("Failed to get record: Identifier does not match supported prefixes {}", supportedIdentifierPrefixes);
+        } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix))) {
+            log.error("Failed to get record: Identifier does not match supported identifier prefixes {}", supportedIdentifierPrefixes);
             return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                     .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH));
         }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index a517c39d10f9c0463a756239c40fa14818d3a6b2..e04cba85cef7d0256add7794bb13b22f62ecb0b4 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -540,7 +540,7 @@ public class TableEndpoint {
         log.debug("endpoint delete table, databaseId={}, tableId={}", databaseId, tableId);
         final Table table = tableService.findById(databaseId, tableId);
         /* roles */
-        if (!table.getOwner().equals(principal) && !UserUtil.hasRole(principal, "delete-foreign-table")) {
+        if (!table.getOwner().getUsername().equals(principal.getName()) && !UserUtil.hasRole(principal, "delete-foreign-table")) {
             log.error("Failed to delete table: not owned by current user");
             throw new NotAllowedException("Failed to delete table: not owned by current user");
         }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
index ca8159fd536ba0f55aefeb418479836b589192eb..fe2d0a343a28bfabf259925d90acf53834f0e209 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
@@ -281,7 +281,7 @@ public class UserEndpoint {
         log.debug("endpoint find a user, userId={}, principal.name={}", userId, principal.getName());
         /* check */
         final User user = userService.findById(userId);
-        if (!user.equals(principal)) {
+        if (!user.getUsername().equals(principal.getName())) {
             if (!UserUtil.hasRole(principal, "find-foreign-user")) {
                 log.error("Failed to find user: foreign user");
                 throw new NotAllowedException("Failed to find user: foreign user");
@@ -332,13 +332,12 @@ public class UserEndpoint {
                                           @NotNull Principal principal) throws NotAllowedException,
             UserNotFoundException, DatabaseNotFoundException {
         log.debug("endpoint modify a user, userId={}, data={}", userId, data);
-        User user = userService.findById(userId);
-        if (!user.equals(principal)) {
-            log.error("Failed to modify user: not current user");
-            throw new NotAllowedException("Failed to modify user: not current user");
+        final User user = userService.findById(userId);
+        if (!user.getUsername().equals(principal.getName())) {
+            log.error("Failed to modify user: not current user {}", user.getId());
+            throw new NotAllowedException("Failed to modify user: not current user " + user.getId());
         }
-        user = userService.modify(user, data);
-        final UserDto dto = userMapper.userToUserDto(user);
+        final UserDto dto = userMapper.userToUserDto(userService.modify(user, data));
         return ResponseEntity.accepted()
                 .body(dto);
     }
@@ -386,7 +385,7 @@ public class UserEndpoint {
             DataServiceConnectionException, CredentialsInvalidException {
         log.debug("endpoint modify a user password, userId={}", userId);
         final User user = userService.findById(userId);
-        if (!user.equals(principal)) {
+        if (!user.getUsername().equals(principal.getName())) {
             log.error("Failed to modify user password: not current user");
             throw new NotAllowedException("Failed to modify user password: not current user");
         }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
index 75958f5bde9f8aca33cf1e517fab437d376866cf..359c1be7967f48ffbaa671f52fa0bcaf5b6c5f61 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
@@ -256,9 +256,9 @@ public class ViewEndpoint {
             SearchServiceConnectionException {
         log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId);
         final Database database = databaseService.findById(databaseId);
-        if (!database.getOwner().equals(principal)) {
-            log.error("Failed to delete view: not the database owner");
-            throw new NotAllowedException("Failed to delete view: not the database owner");
+        if (!database.getOwner().getUsername().equals(principal.getName())) {
+            log.error("Failed to delete view: not the database owner {}", database.getOwner().getId());
+            throw new NotAllowedException("Failed to delete view: not the database owner " + database.getOwner().getId());
         }
         final View view = viewService.findById(database, viewId);
         viewService.delete(view);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
index 75c277a3b9699a722a5d43a6eb6548a809de0406..70f2e4e420eb104b7e76caaa702ed23850fe9565 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
@@ -176,7 +176,7 @@ public class EndpointValidator {
             log.error("validation failed: access is null");
             return false;
         }
-        if (owner.equals(principal) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) {
+        if (owner.getUsername().equals(principal.getName()) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) {
             log.debug("validation passed: user {} matches owner {} and has write access {}", principal.getName(), owner.getUsername(), access.getType());
             return true;
         }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
index 710a64c3ab2d0bf694c87c6626e461eb3fb38f28..861863a3151792709067e299c467f576b5999d58 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
@@ -5,7 +5,6 @@ import at.tuwien.entities.database.Database;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.KeycloakGateway;
-import at.tuwien.repository.UserRepository;
 import at.tuwien.service.*;
 import at.tuwien.service.impl.DatabaseServiceImpl;
 import at.tuwien.test.AbstractUnitTest;
@@ -19,13 +18,13 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.test.context.support.WithAnonymousUser;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.security.Principal;
 import java.util.List;
-import java.util.Optional;
 import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -76,7 +75,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             create_generic(request, null, null);
         });
     }
@@ -91,7 +90,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             create_generic(request, USER_4_PRINCIPAL, USER_4);
         });
     }
@@ -125,6 +124,156 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         create_generic(request, USER_1_PRINCIPAL, USER_1);
     }
 
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database"})
+    public void create_quotaExceeded_fails() throws UserNotFoundException, ContainerNotFoundException {
+        final DatabaseCreateDto request = DatabaseCreateDto.builder()
+                .cid(CONTAINER_4_ID)
+                .name(DATABASE_1_NAME)
+                .isPublic(DATABASE_1_PUBLIC)
+                .build();
+
+        /* mock */
+        when(containerService.find(CONTAINER_4_ID))
+                .thenReturn(CONTAINER_4);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+
+        /* test */
+        assertThrows(ContainerQuotaException.class, () -> {
+            create_generic(request, USER_1_PRINCIPAL, USER_1);
+        });
+    }
+
+    @Test
+    @WithAnonymousUser
+    public void refreshTableMetadata_anonymous_succeeds() {
+
+        /* test */
+        assertThrows(AccessDeniedException.class, () -> {
+            databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, null);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void refreshTableMetadata_noRole_succeeds() {
+
+        /* test */
+        assertThrows(AccessDeniedException.class, () -> {
+            databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"})
+    public void refreshTableMetadata_notOwner_fails() throws UserNotFoundException, TableNotFoundException,
+            SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_2_USERNAME))
+                .thenReturn(USER_2);
+        when(databaseService.updateTableMetadata(any(Database.class)))
+                .thenReturn(DATABASE_1);
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_2_PRINCIPAL);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"})
+    public void refreshTableMetadata_succeeds() throws UserNotFoundException, TableNotFoundException,
+            SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException, NotAllowedException,
+            QueryNotFoundException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+        when(databaseService.updateTableMetadata(any(Database.class)))
+                .thenReturn(DATABASE_1);
+
+        /* test */
+        final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL);
+        assertEquals(HttpStatus.OK, response.getStatusCode());
+        assertNotNull(response.getBody());
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"})
+    public void refreshViewMetadata_succeeds() throws UserNotFoundException, SearchServiceException,
+            NotAllowedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException, ViewNotFoundException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+        when(databaseService.updateViewMetadata(any(Database.class)))
+                .thenReturn(DATABASE_1);
+
+        /* test */
+        final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL);
+        assertEquals(HttpStatus.OK, response.getStatusCode());
+        assertNotNull(response.getBody());
+    }
+
+    @Test
+    @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"})
+    public void refreshViewMetadata_notOwner_fails() throws UserNotFoundException, DatabaseNotFoundException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_2_USERNAME))
+                .thenReturn(USER_2);
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_2_PRINCIPAL);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void refreshViewMetadata_noRole_fails() throws UserNotFoundException, DatabaseNotFoundException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+
+        /* test */
+        assertThrows(AccessDeniedException.class, () -> {
+            databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL);
+        });
+    }
+
+    @Test
+    @WithAnonymousUser
+    public void refreshViewMetadata_anonymous_fails() throws UserNotFoundException, DatabaseNotFoundException {
+
+        /* mock */
+        when(databaseService.findById(DATABASE_1_ID))
+                .thenReturn(DATABASE_1);
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+
+        /* test */
+        assertThrows(AccessDeniedException.class, () -> {
+            databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, null);
+        });
+    }
+
     @Test
     @WithAnonymousUser
     public void list_anonymous_succeeds() throws DatabaseNotFoundException {
@@ -182,7 +331,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             visibility_generic(DATABASE_1_ID, DATABASE_1, request, null);
         });
     }
@@ -214,7 +363,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             visibility_generic(DATABASE_1_ID, DATABASE_1, request, USER_4_PRINCIPAL);
         });
     }
@@ -244,7 +393,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             databaseEndpoint.modifyImage(DATABASE_3_ID, request, USER_4_PRINCIPAL);
         });
     }
@@ -278,7 +427,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             databaseEndpoint.transfer(DATABASE_3_ID, request, USER_4_PRINCIPAL);
         });
     }
@@ -403,7 +552,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         final DatabaseDto response = findById_generic(DATABASE_1_ID, DATABASE_1, USER_1_PRINCIPAL);
         final List<DatabaseAccessDto> accessList = response.getAccesses();
         assertNotNull(accessList);
-        assertEquals(2, accessList.size());
+        assertEquals(3, accessList.size());
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
index 8a98bf11f5035e5e746e3fccfec77691d70a9ff7..ba3debd79dbde119b92b981d05c55a6590ee8975 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
@@ -345,7 +345,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest {
                 StandardCharsets.UTF_8);
 
         /* mock */
-        when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.APA))
+        when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.APA)))
                 .thenReturn(compare);
         when(identifierService.find(IDENTIFIER_1_ID))
                 .thenReturn(IDENTIFIER_1_WITH_DOI);
@@ -437,7 +437,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest {
                 StandardCharsets.UTF_8);
 
         /* mock */
-        when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.IEEE))
+        when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.IEEE)))
                 .thenReturn(compare);
         when(identifierService.find(IDENTIFIER_1_ID))
                 .thenReturn(IDENTIFIER_1_WITH_DOI);
@@ -529,7 +529,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest {
                 StandardCharsets.UTF_8);
 
         /* mock */
-        when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.BIBTEX))
+        when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.BIBTEX)))
                 .thenReturn(compare);
         when(identifierService.find(IDENTIFIER_1_ID))
                 .thenReturn(IDENTIFIER_1_WITH_DOI);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java
index 7ed994534287e13f0f3b33e0c19abcfb360e3f50..8853728d471e3649c5b5108a21ea5404e5ed1ea2 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java
@@ -1,9 +1,9 @@
 package at.tuwien.endpoints;
 
-import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.oaipmh.OaiListIdentifiersParameters;
 import at.tuwien.oaipmh.OaiRecordParameters;
 import at.tuwien.repository.IdentifierRepository;
+import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.utils.XmlUtils;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
@@ -178,6 +178,24 @@ public class MetadataEndpointUnitTest extends AbstractUnitTest {
         // TODO: currently no strict validation passes
     }
 
+    @Test
+    @WithAnonymousUser
+    public void getRecord_invalidIdentifierPrefix_succeeds() {
+        final OaiRecordParameters parameters = new OaiRecordParameters();
+        parameters.setMetadataPrefix("oai_datacite");
+        parameters.setIdentifier("ark:1");
+
+        /* mock */
+        when(identifierRepository.findById(IDENTIFIER_1_ID))
+                .thenReturn(Optional.of(IDENTIFIER_1));
+
+        /* test */
+        final ResponseEntity<String> response = metadataEndpoint.getRecord(parameters);
+        assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode());
+        final String body = response.getBody();
+        assertNotNull(body);
+    }
+
     @Test
     @WithAnonymousUser
     public void getRecord_notFound_fails() {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java
index b7af494253ebc97fa51f3b5da86f72a9515a4703..c3f276c2dfca9a557117571bfa3a147b0f8bc507 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java
@@ -81,6 +81,26 @@ public class OntologyEndpointUnitTest extends AbstractUnitTest {
         find_generic(ONTOLOGY_1_ID, ONTOLOGY_1);
     }
 
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"})
+    public void find_noSparql_fails() throws OntologyNotFoundException {
+        final Ontology mock = Ontology.builder()
+                .id(9999L)
+                .uri(ONTOLOGY_1_URI)
+                .uriPattern(ONTOLOGY_1_URI_PATTERN)
+                .sparqlEndpoint(null) // <<<
+                .build();
+
+        /* mock */
+        when(ontologyService.find(9999L))
+                .thenReturn(mock);
+
+        /* test */
+        assertThrows(OntologyNotFoundException.class, () -> {
+            ontologyEndpoint.find(9999L, null, UNIT_1_URI);
+        });
+    }
+
     @Test
     @WithAnonymousUser
     public void find_notFound_fails() {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
index abfd9653dbbdaf8e40916b893d4acae35af865a0..fb574f35cae9dd3f3e10ae53be29d2d2b87aa8ff 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
@@ -63,23 +63,6 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
         assertNotEquals(CONTAINER_1, CONTAINER_2);
     }
 
-    @Test
-    public void containerEquals_identity_succeeds() {
-
-        /* test */
-        assertEquals(CONTAINER_1, CONTAINER_1);
-    }
-
-    @Test
-    public void containerEquals_similar_succeeds() {
-        final Container tmp = Container.builder()
-                .id(CONTAINER_1_ID)
-                .build();
-
-        /* test */
-        assertEquals(CONTAINER_1, tmp);
-    }
-
     @Test
     public void identifierTypeDtoToIdentifierType_succeeds() {
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java
index fa939b0cb1795b08257b743ddb239bd075871cf0..54015177aaff7d3e52a98b5c2db7103a8c272fc1 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java
@@ -65,8 +65,6 @@ public class AccessServiceUnitTest extends AbstractUnitTest {
     @Test
     public void find_succeeds() throws AccessNotFoundException {
 
-        /* mock */
-
         /* test */
         final DatabaseAccess response = accessService.find(DATABASE_1, USER_1);
         assertEquals(AccessType.READ, response.getType());
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java
index 7cec5e624187fcb5c5285fc4fc0b4787b6a4e9a0..164f335eb73f68c986583da9881b743a32c44a06 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java
@@ -6,7 +6,6 @@ import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.entities.database.table.columns.TableColumnConcept;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
index a319044d3909efc8f87f703c9f6658e1d6be8b5b..43f99276f5c6f8dba3803a29f2fe71cea7cd70b3 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
@@ -30,6 +30,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
@@ -121,6 +122,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
     }
 
     @Test
+    @Transactional(readOnly = true)
     public void find_succeeds() throws IdentifierNotFoundException {
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
index b324a94c9e1c9ba8346eb4d3e3c6a81ecc7cad0b..bda2fc0ee5b103393a14b32b4244018c242d3f5a 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
@@ -54,79 +54,21 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest {
     }
 
     @Test
-    @Transactional
+    @Transactional(readOnly = true)
     public void findById_succeeds() throws DatabaseNotFoundException {
 
         /* test */
         final Database response = databaseService.findById(DATABASE_1_ID);
-        assertEquals(DATABASE_1_ID, response.getId());
-        assertEquals(CONTAINER_1_ID, response.getCid());
-        /* container */
-        assertNotNull(response.getContainer());
-        assertEquals(CONTAINER_1_ID, response.getContainer().getId());
-        assertEquals(CONTAINER_1_NAME, response.getContainer().getName());
-        assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName());
-        assertEquals(CONTAINER_1_HOST, response.getContainer().getHost());
-        assertEquals(CONTAINER_1_PORT, response.getContainer().getPort());
-        assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost());
-        assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort());
-        assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags());
-        assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername());
-        assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword());
-        assertNotNull(response.getContainer().getImage());
-        assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName());
-        assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion());
-        assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect());
-        assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod());
-        assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass());
-        assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry());
-        assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort());
-        /* creator */
-        assertNotNull(response.getOwner());
-        assertEquals(USER_1_ID, response.getOwner().getId());
-        assertEquals(USER_1_USERNAME, response.getOwner().getUsername());
-        assertEquals(USER_1_EMAIL, response.getOwner().getEmail());
-        assertEquals(USER_1_THEME, response.getOwner().getTheme());
-        assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage());
-        assertNotNull(response.getOwner().getAccesses());
+        assertEquals(DATABASE_1, response);
     }
 
     @Test
-    @Transactional
+    @Transactional(readOnly = true)
     public void findByInternalName_succeeds() throws DatabaseNotFoundException {
 
         /* test */
         final Database response = databaseService.findByInternalName(DATABASE_1_INTERNALNAME);
-        assertEquals(DATABASE_1_ID, response.getId());
-        assertEquals(CONTAINER_1_ID, response.getCid());
-        /* container */
-        assertNotNull(response.getContainer());
-        assertEquals(CONTAINER_1_ID, response.getContainer().getId());
-        assertEquals(CONTAINER_1_NAME, response.getContainer().getName());
-        assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName());
-        assertEquals(CONTAINER_1_HOST, response.getContainer().getHost());
-        assertEquals(CONTAINER_1_PORT, response.getContainer().getPort());
-        assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost());
-        assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort());
-        assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags());
-        assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername());
-        assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword());
-        assertNotNull(response.getContainer().getImage());
-        assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName());
-        assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion());
-        assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect());
-        assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod());
-        assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass());
-        assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry());
-        assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort());
-        /* creator */
-        assertNotNull(response.getOwner());
-        assertEquals(USER_1_ID, response.getOwner().getId());
-        assertEquals(USER_1_USERNAME, response.getOwner().getUsername());
-        assertEquals(USER_1_EMAIL, response.getOwner().getEmail());
-        assertEquals(USER_1_THEME, response.getOwner().getTheme());
-        assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage());
-        assertNotNull(response.getOwner().getAccesses());
+        assertEquals(DATABASE_1, response);
     }
 
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
index b0919f816a0b3aa0cbaad90aa62093987c54eabd..7815c4ae69a98c5dfd5171e1c83cd9fdb6de0a72 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
@@ -2,7 +2,9 @@ package at.tuwien.service;
 
 import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.internal.CreateDatabaseDto;
+import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.entities.database.Database;
+import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
@@ -22,10 +24,8 @@ import java.util.List;
 import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
 @Log4j2
 @SpringBootTest
@@ -87,6 +87,263 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         });
     }
 
+    @Test
+    public void findByInternalName_notFound_fails() {
+
+        /* mock */
+        when(databaseRepository.findByInternalName(DATABASE_1_INTERNALNAME))
+                .thenReturn(Optional.empty());
+
+        /* test */
+        assertThrows(DatabaseNotFoundException.class, () -> {
+            databaseService.findByInternalName(DATABASE_1_INTERNALNAME);
+        });
+    }
+
+    @Test
+    public void updatePassword_succeeds() throws DataServiceException, DatabaseNotFoundException,
+            DataServiceConnectionException {
+
+        /* mock */
+        when(databaseRepository.findReadAccess(USER_1_ID))
+                .thenReturn(List.of(DATABASE_1));
+        doNothing()
+                .when(dataServiceGateway)
+                .updateDatabase(eq(DATABASE_1_ID), any(UpdateUserPasswordDto.class));
+
+        /* test */
+        databaseService.updatePassword(DATABASE_1, USER_1);
+    }
+
+    @Test
+    public void modifyImage_succeeds() throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException {
+        final byte[] image = new byte[]{1, 2, 3, 4, 5};
+
+        /* mock */
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.modifyImage(DATABASE_1, image);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void modifyImage_searchServiceNotFound_fails() throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+        final byte[] image = new byte[]{1, 2, 3, 4, 5};
+
+        /* mock */
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(DatabaseNotFoundException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(DatabaseNotFoundException.class, () -> {
+            databaseService.modifyImage(DATABASE_1, image);
+        });
+    }
+
+    @Test
+    public void modifyImage_searchServiceConnection_fails() throws SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+        final byte[] image = new byte[]{1, 2, 3, 4, 5};
+
+        /* mock */
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(SearchServiceConnectionException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(SearchServiceConnectionException.class, () -> {
+            databaseService.modifyImage(DATABASE_1, image);
+        });
+    }
+
+    @Test
+    public void updateViewMetadata_empty_succeeds() throws SearchServiceException, DataServiceException,
+            QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException,
+            DataServiceConnectionException, ViewNotFoundException {
+
+        /* mock */
+        when(dataServiceGateway.getViewSchemas(DATABASE_1_ID))
+                .thenReturn(List.of());
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateViewMetadata(DATABASE_1);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void updateViewMetadata_searchServiceConnection_fails() throws SearchServiceException, DataServiceException,
+            DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException,
+            ViewNotFoundException {
+
+        /* mock */
+        when(dataServiceGateway.getViewSchemas(DATABASE_1_ID))
+                .thenReturn(List.of());
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(SearchServiceConnectionException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(SearchServiceConnectionException.class, () -> {
+            databaseService.updateViewMetadata(DATABASE_1);
+        });
+    }
+
+    @Test
+    public void updateViewMetadata_searchServiceNotFound_fails() throws SearchServiceException, DataServiceException,
+            DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException,
+            ViewNotFoundException {
+
+        /* mock */
+        when(dataServiceGateway.getViewSchemas(DATABASE_1_ID))
+                .thenReturn(List.of());
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(DatabaseNotFoundException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(DatabaseNotFoundException.class, () -> {
+            databaseService.updateViewMetadata(DATABASE_1);
+        });
+    }
+
+    @Test
+    public void updateViewMetadata_oneMissing_succeeds() throws SearchServiceException, DataServiceException,
+            QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException,
+            DataServiceConnectionException, ViewNotFoundException {
+
+        /* mock */
+        when(dataServiceGateway.getViewSchemas(DATABASE_1_ID))
+                .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO, VIEW_4_DTO)); /* <<< */
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateViewMetadata(DATABASE_1);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void updateViewMetadata_allKnown_succeeds() throws SearchServiceException, DataServiceException,
+            QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException,
+            DataServiceConnectionException, ViewNotFoundException {
+
+        /* mock */
+        when(dataServiceGateway.getViewSchemas(DATABASE_1_ID))
+                .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); /* <<< */
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateViewMetadata(DATABASE_1);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void updateTableMetadata_empty_succeeds() throws TableNotFoundException, SearchServiceException,
+            MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException {
+
+        /* mock */
+        when(dataServiceGateway.getTableSchemas(DATABASE_1_ID))
+                .thenReturn(List.of());
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateTableMetadata(DATABASE_1);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void updateTableMetadata_allKnown_succeeds() throws TableNotFoundException, SearchServiceException,
+            MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException {
+
+        /* mock */
+        when(dataServiceGateway.getTableSchemas(DATABASE_1_ID))
+                .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO));
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateTableMetadata(DATABASE_1);
+        assertNotNull(response);
+    }
+
+    @Test
+    public void updateTableMetadata_oneMissing_succeeds() throws TableNotFoundException, SearchServiceException,
+            MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException,
+            SearchServiceConnectionException, DataServiceConnectionException {
+
+        /* mock */
+        when(dataServiceGateway.getTableSchemas(DATABASE_1_ID))
+                .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO, TABLE_5_DTO));
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final Database response = databaseService.updateTableMetadata(DATABASE_1);
+        assertNotNull(response);
+        final Optional<Table> optional = response.getTables()
+                .stream()
+                .filter(t -> t.getInternalName().equals(TABLE_5_INTERNALNAME))
+                .findFirst();
+        assertTrue(optional.isPresent());
+        final Table table = optional.get();
+        table.getColumns()
+                .forEach(column -> {
+                    assertNotNull(column.getTable());
+                    assertEquals(TABLE_5_ID, column.getTable().getId());
+                });
+        table.getConstraints()
+                .getUniques()
+                .forEach(uk -> {
+                    assertNotNull(uk.getTable());
+                    assertEquals(TABLE_5_ID, uk.getTable().getId());
+                });
+        table.getConstraints()
+                .getForeignKeys()
+                .forEach(fk -> {
+                    assertNotNull(fk.getTable());
+                    assertEquals(TABLE_5_ID, fk.getTable().getId());
+                });
+        table.getConstraints()
+                .getPrimaryKey()
+                .forEach(pk -> {
+                    assertNotNull(pk.getTable());
+                    assertEquals(TABLE_5_ID, pk.getTable().getId());
+                    assertEquals(TABLE_5_COLUMNS.get(0), pk.getColumn());
+                });
+    }
+
     @Test
     public void find_succeeds() throws DatabaseNotFoundException {
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
index 48da5206bbd8ddeb4125605891a7b4bef1e0f1f6..8947e823fc9ce070343d6f32bd68e5b793a14014 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
@@ -118,6 +118,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
     }
 
     @Test
+    @Transactional(readOnly = true)
     public void find_succeeds() throws IdentifierNotFoundException {
 
         /* test */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
index 8a5c4af131fd40775e7c826a17ce4b7506c80960..3126f9e9f42b36fb8dc09dfa3f8e60c88d851722 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java
@@ -30,11 +30,13 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.util.List;
+import java.util.Set;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.when;
 
 @Log4j2
 @SpringBootTest
@@ -140,4 +142,21 @@ public class TableServicePersistenceTest extends AbstractUnitTest {
         assertEquals(request.getConstraints().getForeignKeys().size(), foreignKeys.size());
     }
 
+    @Test
+    public void findColumnById_succeeds() throws MalformedException {
+
+        /* test */
+        final TableColumn response = tableService.findColumnById(TABLE_1, COLUMN_1_1_ID);
+        assertEquals(TABLE_1_COLUMNS.get(0), response);
+    }
+
+    @Test
+    public void findColumnById_fails() {
+
+        /* test */
+        assertThrows(MalformedException.class, () -> {
+            tableService.findColumnById(TABLE_1, 9999L);
+        });
+    }
+
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index 01fc883bc8668b8c163527913b23d1206af302a6..477d2bd17da0d350e53c1b142c07f9531293d0f8 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -1,8 +1,11 @@
 package at.tuwien.service;
 
 import at.tuwien.api.database.table.TableCreateDto;
+import at.tuwien.api.database.table.TableStatisticDto;
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
+import at.tuwien.api.database.table.columns.ColumnStatisticDto;
 import at.tuwien.api.database.table.columns.ColumnTypeDto;
+import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
 import at.tuwien.api.database.table.constraints.ConstraintsCreateDto;
 import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto;
 import at.tuwien.entities.database.Database;
@@ -25,6 +28,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -46,6 +50,15 @@ public class TableServiceUnitTest extends AbstractUnitTest {
     @MockBean
     private UserService userService;
 
+    @MockBean
+    private UnitService unitService;
+
+    @MockBean
+    private EntityService entityService;
+
+    @MockBean
+    private ConceptService conceptService;
+
     @MockBean
     private DataServiceGateway dataServiceGateway;
 
@@ -111,6 +124,146 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         });
     }
 
+    @Test
+    public void updateStatistics_succeeds() throws TableNotFoundException, DataServiceException,
+            DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException, MalformedException {
+
+        /* mock */
+        when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID))
+                .thenReturn(TABLE_8_STATISTIC_DTO);
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        tableService.updateStatistics(TABLE_8);
+    }
+
+    @Test
+    public void updateStatistics_searchServiceNotFound_fails() throws TableNotFoundException, DataServiceException,
+            DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+
+        /* mock */
+        when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID))
+                .thenReturn(TABLE_8_STATISTIC_DTO);
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(DatabaseNotFoundException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(DatabaseNotFoundException.class, () -> {
+            tableService.updateStatistics(TABLE_8);
+        });
+    }
+
+    @Test
+    public void updateStatistics_searchServiceConnection_fails() throws TableNotFoundException, DataServiceException,
+            DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException,
+            SearchServiceConnectionException {
+
+        /* mock */
+        when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID))
+                .thenReturn(TABLE_8_STATISTIC_DTO);
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        doThrow(SearchServiceConnectionException.class)
+                .when(searchServiceGateway)
+                .update(any(Database.class));
+
+        /* test */
+        assertThrows(SearchServiceConnectionException.class, () -> {
+            tableService.updateStatistics(TABLE_8);
+        });
+    }
+
+    @Test
+    public void updateStatistics_columnNotFound_fails() throws TableNotFoundException, DataServiceException,
+            DataServiceConnectionException {
+        final TableStatisticDto mock = TableStatisticDto.builder()
+                .columns(new HashMap<>() {{
+                    put("unknown_column", ColumnStatisticDto.builder()
+                            .min(BigDecimal.valueOf(11.2))
+                            .max(BigDecimal.valueOf(23.1))
+                            .mean(BigDecimal.valueOf(13.5333))
+                            .median(BigDecimal.valueOf(11.4))
+                            .stdDev(BigDecimal.valueOf(4.2952))
+                            .build());
+                }})
+                .build();
+
+        /* mock */
+        when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID))
+                .thenReturn(mock);
+
+        /* test */
+        assertThrows(MalformedException.class, () -> {
+            tableService.updateStatistics(TABLE_8);
+        });
+    }
+
+    @Test
+    public void update_known_succeeds() throws SearchServiceException, MalformedException, DataServiceException,
+            DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException,
+            SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException,
+            ConceptNotFoundException {
+        final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder()
+                .unitUri(UNIT_1_URI)
+                .conceptUri(CONCEPT_1_URI)
+                .build();
+
+        /* mock */
+        when(unitService.find(UNIT_1_URI))
+                .thenReturn(UNIT_1);
+        when(conceptService.find(CONCEPT_1_URI))
+                .thenReturn(CONCEPT_1);
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request);
+        assertNotNull(response.getUnit());
+        assertNotNull(response.getConcept());
+    }
+
+    @Test
+    public void update_unknown_succeeds() throws SearchServiceException, MalformedException, DataServiceException,
+            DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException,
+            SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException,
+            ConceptNotFoundException {
+        final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder()
+                .unitUri(UNIT_1_URI)
+                .conceptUri(CONCEPT_1_URI)
+                .build();
+
+        /* mock */
+        doThrow(UnitNotFoundException.class)
+                .when(unitService)
+                .find(UNIT_1_URI);
+        when(entityService.findOneByUri(UNIT_1_URI))
+                .thenReturn(UNIT_1_ENTITY_DTO);
+        doThrow(ConceptNotFoundException.class)
+                .when(conceptService)
+                .find(CONCEPT_1_URI);
+        when(entityService.findOneByUri(CONCEPT_1_URI))
+                .thenReturn(CONCEPT_1_ENTITY_DTO);
+        when(databaseRepository.save(any(Database.class)))
+                .thenReturn(DATABASE_1);
+        when(searchServiceGateway.update(any(Database.class)))
+                .thenReturn(DATABASE_1_DTO);
+
+        /* test */
+        final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request);
+        assertNotNull(response.getUnit());
+        assertNotNull(response.getConcept());
+    }
+
     @Test
     public void createTable_succeeds() throws DataServiceException, DataServiceConnectionException,
             UserNotFoundException, TableNotFoundException, DatabaseNotFoundException, TableExistsException,
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java
index 8528d29f07d267bd4dcbe94de5379e47e13f1cef..9444cea6e909995d7a4c04194020eea377e19217 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java
@@ -1,21 +1,20 @@
 package at.tuwien.validator;
 
-import at.tuwien.entities.database.Database;
-import at.tuwien.entities.user.User;
-import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.SortType;
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
 import at.tuwien.api.database.table.columns.ColumnTypeDto;
 import at.tuwien.api.identifier.IdentifierSaveDto;
+import at.tuwien.entities.database.Database;
+import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.service.AccessService;
 import at.tuwien.service.DatabaseService;
 import at.tuwien.service.TableService;
+import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.validation.EndpointValidator;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -159,12 +158,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    @Disabled
-    public void validateOnlyAccessOrPublic_privateAnonymous_fails() throws DatabaseNotFoundException {
-
-        /* mock */
-        when(databaseService.findById(anyLong()))
-                .thenReturn(DATABASE_1);
+    public void validateOnlyAccessOrPublic_privateAnonymous_fails() {
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -173,13 +167,9 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    @Disabled
-    public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws DatabaseNotFoundException,
-            AccessNotFoundException {
+    public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws AccessNotFoundException {
 
         /* mock */
-        when(databaseService.findById(DATABASE_1_ID))
-                .thenReturn(DATABASE_1);
         doThrow(AccessNotFoundException.class)
                 .when(accessService)
                 .find(any(Database.class), any(User.class));
@@ -334,12 +324,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    @Disabled
-    public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() throws DatabaseNotFoundException {
-
-        /* mock */
-        when(databaseService.findById(anyLong()))
-                .thenReturn(DATABASE_1);
+    public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() {
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -348,12 +333,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    @Disabled
-    public void validateOnlyPrivateHasRole_privateRoleMissing_fails() throws DatabaseNotFoundException {
-
-        /* mock */
-        when(databaseService.findById(anyLong()))
-                .thenReturn(DATABASE_1);
+    public void validateOnlyPrivateHasRole_privateRoleMissing_fails() {
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
index c47bb8daa36519ff251202d14a02f38c9212aafe..2642574f2720e0e6f565e0b83669c6398ccf453f 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
@@ -6,6 +6,7 @@ import at.tuwien.entities.database.DatabaseAccess;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 
+import java.security.Principal;
 import java.util.List;
 
 public interface AccessService {
@@ -19,7 +20,7 @@ public interface AccessService {
     List<DatabaseAccess> list(Database database);
 
     /**
-     * Finds database access by given database and user.
+     * Finds database access by given database and user, where the access is determined by the username (needed since {@link Principal#getName()} embeds the username).
      *
      * @param database The database.
      * @param user     The user.
@@ -37,7 +38,7 @@ public interface AccessService {
      * @return The database access, if successful.
      * @throws DataServiceException           The data service responded with unexpected behavior.
      * @throws DataServiceConnectionException The connection with the data service could not be established.
-     * @throws DatabaseNotFoundException  The database was not found in the metadata/search database.
+     * @throws DatabaseNotFoundException      The database was not found in the metadata/search database.
      */
     DatabaseAccess create(Database database, User user, AccessTypeDto access) throws DataServiceException, DataServiceConnectionException,
             DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException;
@@ -50,7 +51,7 @@ public interface AccessService {
      * @param access   The updated access.
      * @throws DataServiceException           The data service responded with unexpected behavior.
      * @throws DataServiceConnectionException The connection with the data service could not be established.
-     * @throws DatabaseNotFoundException  The database was not found in the metadata/search database.
+     * @throws DatabaseNotFoundException      The database was not found in the metadata/search database.
      */
     void update(Database database, User user, AccessTypeDto access) throws at.tuwien.exception.DataServiceException, DataServiceConnectionException,
             AccessNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException;
@@ -62,7 +63,7 @@ public interface AccessService {
      * @param user     The user.
      * @throws DataServiceException           The data service responded with unexpected behavior.
      * @throws DataServiceConnectionException The connection with the data service could not be established.
-     * @throws DatabaseNotFoundException  The database was not found in the search database.
+     * @throws DatabaseNotFoundException      The database was not found in the search database.
      */
     void delete(Database database, User user) throws AccessNotFoundException, DataServiceException,
             DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException;
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
index b3f98b01bbb2d406738d314fd15333727aaf4885..a0f45fb34f3c3762a8da630c622d9aa23d327af3 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
@@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.security.Principal;
 import java.util.List;
 import java.util.Optional;
 
@@ -52,7 +51,7 @@ public class AccessServiceImpl implements AccessService {
     public DatabaseAccess find(Database database, User user) throws AccessNotFoundException {
         final Optional<DatabaseAccess> optional = database.getAccesses()
                 .stream()
-                .filter(a -> a.getUser().getId().equals(user.getId()))
+                .filter(a -> a.getUser().getUsername().equals(user.getUsername()))
                 .findFirst();
         if (optional.isEmpty()) {
             log.error("Failed to find database access for database with id: {}", database.getId());
@@ -93,19 +92,16 @@ public class AccessServiceImpl implements AccessService {
         /* update in data database */
         dataServiceGateway.updateAccess(database.getId(), user.getId(), access);
         /* update in metadata database */
-        final DatabaseAccess entity = DatabaseAccess.builder()
-                .hdbid(database.getId())
-                .database(database)
-                .huserid(user.getId())
-                .type(metadataMapper.accessTypeDtoToAccessType(access))
-                .user(user)
-                .build();
-        final int idx = database.getAccesses().indexOf(entity);
-        if (idx == -1) {
-            log.error("Failed to update access");
-            throw new AccessNotFoundException("Failed to find update access");
+        final Optional<DatabaseAccess> optional = database.getAccesses()
+                .stream()
+                .filter(a -> a.getUser().getId().equals(user.getId()))
+                .findFirst();
+        if (optional.isEmpty()) {
+            log.error("Failed to update access for user with id: {}", user.getId());
+            throw new AccessNotFoundException("Failed to find update access for user with id: " + user.getId());
         }
-        database.getAccesses().set(idx, entity);
+        optional.get()
+                .setType(metadataMapper.accessTypeDtoToAccessType(access));
         database = databaseRepository.save(database);
         /* update in search service */
         searchServiceGateway.update(database);
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
index c67cb68ce2ca8bf58d07654a3a05deeb97404a4d..b0f5d3f85c3474c4c577e4c21b4633a543f8ad73 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
@@ -1,5 +1,6 @@
 package at.tuwien.test;
 
+import at.tuwien.entities.database.AccessType;
 import org.springframework.test.context.TestPropertySource;
 
 import java.util.LinkedList;
@@ -25,11 +26,16 @@ public abstract class AbstractUnitTest extends BaseTest {
         /* USER_4 */
         USER_5.setAccesses(new LinkedList<>());
         /* DATABASE 1 */
+        TABLE_1_COLUMNS.get(0).setUnit(null);
+        TABLE_1_COLUMNS.get(0).setConcept(null);
         DATABASE_1.setOwner(USER_1);
         DATABASE_1.setSubsets(new LinkedList<>());
+        DATABASE_1.setIsPublic(false);
+        DATABASE_1_USER_1_READ_ACCESS.setType(AccessType.READ);
         DATABASE_1.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS, DATABASE_1_USER_2_WRITE_OWN_ACCESS, DATABASE_1_USER_3_WRITE_ALL_ACCESS)));
         DATABASE_1_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS_DTO, DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO, DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO)));
         TABLE_1.setDatabase(DATABASE_1);
+        UNIT_1.setId(UNIT_1_ID);
         TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS));
         TABLE_1.setConstraints(TABLE_1_CONSTRAINTS);
         TABLE_1_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO));
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index 78c14fe2acb2e3b1c1bd19d6c4d139ea73620414..f706dd021d1578677d9ad356b0726f4b4e6d49aa 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -56,6 +56,7 @@ import at.tuwien.api.orcid.activities.employments.affiliation.group.summary.orga
 import at.tuwien.api.orcid.person.OrcidPersonDto;
 import at.tuwien.api.orcid.person.name.OrcidNameDto;
 import at.tuwien.api.orcid.person.name.OrcidValueDto;
+import at.tuwien.api.semantics.EntityDto;
 import at.tuwien.api.semantics.OntologyCreateDto;
 import at.tuwien.api.semantics.OntologyModifyDto;
 import at.tuwien.api.user.*;
@@ -313,6 +314,12 @@ public abstract class BaseTest {
             .created(CONCEPT_1_CREATED)
             .build();
 
+    public final static EntityDto CONCEPT_1_ENTITY_DTO = EntityDto.builder()
+            .uri(CONCEPT_1_URI)
+            .description(CONCEPT_1_DESCRIPTION)
+            .label(CONCEPT_1_NAME)
+            .build();
+
     public final static Long CONCEPT_2_ID = 2L;
     public final static String CONCEPT_2_NAME = "FAIR data";
     public final static String CONCEPT_2_URI = "http://www.wikidata.org/entity/Q29032648";
@@ -367,6 +374,12 @@ public abstract class BaseTest {
             .created(UNIT_1_CREATED)
             .build();
 
+    public final static EntityDto UNIT_1_ENTITY_DTO = EntityDto.builder()
+            .uri(UNIT_1_URI)
+            .description(UNIT_1_DESCRIPTION)
+            .label(UNIT_1_NAME)
+            .build();
+
     public final static Long UNIT_2_ID = 2L;
     public final static String UNIT_2_NAME = "tonne";
     public final static String UNIT_2_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/tonne";
@@ -2339,6 +2352,7 @@ public abstract class BaseTest {
     public final static String ONTOLOGY_1_PREFIX = "om2";
     public final static String ONTOLOGY_1_NEW_PREFIX = "om-2";
     public final static String ONTOLOGY_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/";
+    public final static String ONTOLOGY_1_URI_PATTERN = "http://www.ontology-of-units-of-measure.org/resource/om-2/.*";
     public final static String ONTOLOGY_1_SPARQL_ENDPOINT = null;
     public final static String ONTOLOGY_1_RDF_PATH = "rdf/om-2.0.rdf";
     public final static UUID ONTOLOGY_1_CREATED_BY = USER_1_ID;
@@ -2347,6 +2361,7 @@ public abstract class BaseTest {
             .id(ONTOLOGY_1_ID)
             .prefix(ONTOLOGY_1_PREFIX)
             .uri(ONTOLOGY_1_URI)
+            .uriPattern(ONTOLOGY_1_URI_PATTERN)
             .sparqlEndpoint(ONTOLOGY_1_SPARQL_ENDPOINT)
             .rdfPath(ONTOLOGY_1_RDF_PATH)
             .build();
@@ -7759,6 +7774,7 @@ public abstract class BaseTest {
     public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder()
             .checks(new LinkedHashSet<>(List.of("`mintemp` > 0")))
             .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder()
+                    .id(1L)
                     .name("fk_location")
                     .onDelete(ReferenceType.NO_ACTION)
                     .references(new LinkedList<>(List.of(ForeignKeyReference.builder()