diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java
index ee1e076..aafbfa0 100644
--- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java
@@ -5,11 +5,10 @@
*/
package org.scientificcms.contenttypes.sciproject;
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.envers.Audited;
import org.libreccm.core.CcmObjects;
+import org.libreccm.imexport.Exportable;
import org.librecms.assets.ContactableEntity;
import java.io.Serializable;
@@ -33,11 +32,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*;
@Entity(name = "ProjectContact")
@Audited
@Table(name = "PROJECT_CONTACTS", schema = DB_SCHEMA)
-@JsonIdentityInfo(
- generator = ObjectIdGenerators.PropertyGenerator.class,
- property = "uuid"
-)
-public class Contact implements Serializable {
+public class Contact implements Exportable, Serializable {
private static final long serialVersionUID = 1L;
@@ -46,6 +41,10 @@ public class Contact implements Serializable {
@GeneratedValue(strategy = GenerationType.AUTO)
private long contactId;
+ @Id
+ @Column(name = "uuid", unique = true, nullable = false)
+ private String uuid;
+
@Column(name = "CONTACT_TYPE", length = 255, nullable = true)
private String contactType;
@@ -66,10 +65,18 @@ public class Contact implements Serializable {
return contactId;
}
- public void setContactId(final long contactId) {
+ protected void setContactId(final long contactId) {
this.contactId = contactId;
}
+ public String getUuid() {
+ return uuid;
+ }
+
+ protected void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
public String getContactType() {
return contactType;
}
@@ -106,6 +113,7 @@ public class Contact implements Serializable {
public int hashCode() {
int hash = 7;
hash = 41 * hash + (int) (contactId ^ (contactId >>> 32));
+ hash = 41 * hash + Objects.hashCode(uuid);
hash = 41 * hash + Objects.hashCode(contactType);
hash = 41 * hash + (int) (order ^ (order >>> 32));
hash = 41 * hash + CcmObjects.hashCodeUsingUuid(project);
@@ -115,7 +123,6 @@ public class Contact implements Serializable {
@Override
public boolean equals(final Object obj) {
-
if (this == obj) {
return true;
}
@@ -132,6 +139,9 @@ public class Contact implements Serializable {
if (contactId != other.getContactId()) {
return false;
}
+ if (!Objects.equals(uuid, other.getUuid())) {
+ return false;
+ }
if (!Objects.equals(contactType, other.getContactType())) {
return false;
}
@@ -145,56 +155,60 @@ public class Contact implements Serializable {
}
public boolean canEqual(final Object obj) {
-
return obj instanceof Contact;
}
@Override
public final String toString() {
-
return toString("");
}
public String toString(final String data) {
-
final String projectStr;
if (project == null) {
projectStr = "";
} else {
- projectStr = String.format("objectId = %d,"
- + "uuid = \"%s\", "
- + "name = \"%s\"",
- project.getObjectId(),
- project.getUuid(),
- project.getDisplayName());
+ projectStr = String.format(
+ "objectId = %d,"
+ + "uuid = \"%s\", "
+ + "name = \"%s\"",
+ project.getObjectId(),
+ project.getUuid(),
+ project.getDisplayName()
+ );
}
final String contactableStr;
if (contactable == null) {
contactableStr = "";
} else {
- contactableStr = String.format("objectId = %d,"
- + "uuid = \"%s\", "
- + "name = \"%s\"",
- contactable.getObjectId(),
- contactable.getUuid(),
- contactable.getDisplayName());
+ contactableStr = String.format(
+ "objectId = %d,"
+ + "uuid = \"%s\", "
+ + "name = \"%s\"",
+ contactable.getObjectId(),
+ contactable.getUuid(),
+ contactable.getDisplayName()
+ );
}
- return String.format("%s{ "
- + "contactId = %d, "
- + "contactType = \"%s\", "
- + "order = %d, "
- + "project = { %s } "
- + "contactableUuid = %s%s"
- + " }",
- super.toString(),
- contactId,
- contactType,
- order,
- projectStr,
- contactableStr,
- data
+ return String.format(
+ "%s{ "
+ + "contactId = %d, "
+ + "uuid = %s, "
+ + "contactType = \"%s\", "
+ + "order = %d, "
+ + "project = { %s } "
+ + "contactableUuid = %s%s"
+ + " }",
+ super.toString(),
+ contactId,
+ uuid,
+ contactType,
+ order,
+ projectStr,
+ contactableStr,
+ data
);
}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactImExporter.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactImExporter.java
new file mode 100644
index 0000000..9105fe8
--- /dev/null
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactImExporter.java
@@ -0,0 +1,66 @@
+package org.scientificcms.contenttypes.sciproject;
+
+import org.libreccm.imexport.AbstractEntityImExporter;
+import org.libreccm.imexport.Processes;
+import org.librecms.assets.Organization;
+import org.librecms.assets.Person;
+
+import java.util.Objects;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ * Importer/Exporter for {@link Contact} entities.
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Processes(Contact.class)
+public class ContactImExporter
+ extends AbstractEntityImExporter {
+
+ @Inject
+ private ContactRepository contactRepo;
+
+ @PostConstruct
+ @Override
+ protected void init() {
+ addRequiredEntities(
+ Set.of(
+ SciProject.class,
+ Organization.class,
+ Person.class
+ )
+ );
+ }
+
+ @Override
+ public Class getEntityClass() {
+ return Contact.class;
+ }
+
+ @Override
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected void saveImportedEntity(final Contact entity) {
+ contactRepo.save(entity);
+ }
+
+ @Override
+ protected Contact reloadEntity(final Contact entity) {
+ return contactRepo
+ .findById(entity.getContactId())
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "Contact entity %s was not found in the database.",
+ Objects.toString(entity)
+ )
+ )
+ );
+ }
+
+}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactRepository.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactRepository.java
index 1ede221..0cfd7ee 100644
--- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactRepository.java
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ContactRepository.java
@@ -2,6 +2,8 @@ package org.scientificcms.contenttypes.sciproject;
import org.libreccm.auditing.AbstractAuditedEntityRepository;
+import java.util.UUID;
+
import javax.enterprise.context.RequestScoped;
/**
@@ -38,5 +40,10 @@ public class ContactRepository
public boolean isNew(final Contact contact) {
return contact.getContactId() == 0;
}
+
+ @Override
+ public void initNewEntity(final Contact contact) {
+ contact.setUuid(UUID.randomUUID().toString());
+ }
}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java
index e22b97f..70c3c47 100644
--- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java
@@ -1,8 +1,3 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
package org.scientificcms.contenttypes.sciproject;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
@@ -10,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIdentityReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.envers.Audited;
import org.libreccm.core.CcmObjects;
+import org.libreccm.imexport.Exportable;
import org.librecms.assets.Person;
import java.io.Serializable;
@@ -39,7 +35,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*;
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "uuid"
)
-public class Membership implements Serializable {
+public class Membership implements Exportable, Serializable {
private static final long serialVersionUID = 1L;
@@ -48,6 +44,9 @@ public class Membership implements Serializable {
@GeneratedValue(strategy = GenerationType.AUTO)
private long membershipId;
+ @Column(name = "uuid", unique = true, nullable = false)
+ private String uuid;
+
@Column(name = "MEMBER_ROLE", length = 255, nullable = true)
private String role;
@@ -73,6 +72,15 @@ public class Membership implements Serializable {
this.membershipId = membershipId;
}
+ @Override
+ public String getUuid() {
+ return uuid;
+ }
+
+ protected void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
public String getRole() {
return role;
}
@@ -110,6 +118,7 @@ public class Membership implements Serializable {
int hash = 7;
hash = 37 * hash
+ (int) (membershipId ^ (membershipId >>> 32));
+ hash = 37 * hash + Objects.hashCode(uuid);
hash = 37 * hash + Objects.hashCode(role);
hash = 37 * hash + Objects.hashCode(status);
hash = 37 * hash + CcmObjects.hashCodeUsingUuid(project);
@@ -119,7 +128,6 @@ public class Membership implements Serializable {
@Override
public boolean equals(final Object obj) {
-
if (this == obj) {
return true;
}
@@ -137,6 +145,9 @@ public class Membership implements Serializable {
if (membershipId != other.getMembershipId()) {
return false;
}
+ if (!Objects.equals(uuid, other.getUuid())) {
+ return false;
+ }
if (!Objects.equals(role, other.getRole())) {
return false;
}
@@ -151,64 +162,68 @@ public class Membership implements Serializable {
}
public boolean canEqual(final Object obj) {
-
return obj instanceof Membership;
}
@Override
public final String toString() {
-
return toString("");
}
public String toString(final String data) {
-
final String projectStr;
if (project == null) {
projectStr = "";
} else {
- projectStr = String.format("objectId = %d,"
- + "uuid = \"%s\", "
- + "name = \"%s\"",
- project.getObjectId(),
- project.getUuid(),
- project.getDisplayName());
+ projectStr = String.format(
+ "objectId = %d,"
+ + "uuid = \"%s\", "
+ + "name = \"%s\"",
+ project.getObjectId(),
+ project.getUuid(),
+ project.getDisplayName()
+ );
}
final String memberStr;
if (member == null) {
memberStr = "";
} else {
- memberStr = String.format("objectId = %d, "
- + "uuid = \"%s\", "
- + "name = \"%s\", "
- + "surname = \"%s\", "
- + "givenName = \"%s\", "
- + "prefix = \"%s\", "
- + "suffix = \"%s\"",
- member.getObjectId(),
- member.getUuid(),
- member.getDisplayName(),
- member.getPersonName().getSurname(),
- member.getPersonName().getGivenName(),
- member.getPersonName().getPrefix(),
- member.getPersonName().getSuffix());
+ memberStr = String.format(
+ "objectId = %d, "
+ + "uuid = \"%s\", "
+ + "name = \"%s\", "
+ + "surname = \"%s\", "
+ + "givenName = \"%s\", "
+ + "prefix = \"%s\", "
+ + "suffix = \"%s\"",
+ member.getObjectId(),
+ member.getUuid(),
+ member.getDisplayName(),
+ member.getPersonName().getSurname(),
+ member.getPersonName().getGivenName(),
+ member.getPersonName().getPrefix(),
+ member.getPersonName().getSuffix()
+ );
}
- return String.format("%s{ "
- + "membershipId = %d, "
- + "role = \"%s\", "
- + "status = \"%s\","
- + "project = { %s }, "
- + "member = { %s }%s"
- + " }",
- super.toString(),
- membershipId,
- role,
- Objects.toString(status),
- projectStr,
- memberStr,
- data
+ return String.format(
+ "%s{ "
+ + "membershipId = %d, "
+ + "uuid = %s, "
+ + "role = \"%s\", "
+ + "status = \"%s\","
+ + "project = { %s }, "
+ + "member = { %s }%s"
+ + " }",
+ super.toString(),
+ membershipId,
+ uuid,
+ role,
+ Objects.toString(status),
+ projectStr,
+ memberStr,
+ data
);
}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/MembershipImExporter.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/MembershipImExporter.java
new file mode 100644
index 0000000..612f1bd
--- /dev/null
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/MembershipImExporter.java
@@ -0,0 +1,60 @@
+package org.scientificcms.contenttypes.sciproject;
+
+import org.libreccm.imexport.AbstractEntityImExporter;
+import org.librecms.assets.Person;
+
+import java.util.Objects;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ * Importer/Exporter for {@link Membership} entities.
+ *
+ * @author Jens Pelzetter
+ */
+public class MembershipImExporter
+ extends AbstractEntityImExporter {
+
+ @Inject
+ private MembershipRepository membershipRepo;
+
+ @PostConstruct
+ @Override
+ protected void init() {
+ addRequiredEntities(
+ Set.of(
+ SciProject.class,
+ Person.class
+ )
+ );
+ }
+
+ @Override
+ public Class getEntityClass() {
+ return Membership.class;
+ }
+
+ @Override
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected void saveImportedEntity(final Membership entity) {
+ membershipRepo.save(entity);
+ }
+
+ @Override
+ protected Membership reloadEntity(final Membership entity) {
+ return membershipRepo
+ .findById(entity.getMembershipId())
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "Membership entity %s was not found in the database.",
+ Objects.toString(entity)
+ )
+ )
+ );
+ }
+
+}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConstants.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConstants.java
index 785a098..ef449a2 100644
--- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConstants.java
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConstants.java
@@ -1,8 +1,4 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
+
package org.scientificcms.contenttypes.sciproject;
/**
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java
index e54ca32..1abdc39 100644
--- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java
@@ -1,15 +1,9 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
package org.scientificcms.contenttypes.sciproject;
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.envers.Audited;
import org.libreccm.core.CcmObjects;
+import org.libreccm.imexport.Exportable;
import org.librecms.assets.Organization;
import java.io.Serializable;
@@ -33,11 +27,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*;
@Entity
@Audited
@Table(name = "SPONSORING", schema = DB_SCHEMA)
-@JsonIdentityInfo(
- generator = ObjectIdGenerators.PropertyGenerator.class,
- property = "uuid"
-)
-public class Sponsoring implements Serializable {
+public class Sponsoring implements Exportable, Serializable {
private static final long serialVersionUID = 1L;
@@ -46,6 +36,9 @@ public class Sponsoring implements Serializable {
@GeneratedValue(strategy = GenerationType.AUTO)
private long sponsoringId;
+ @Column(name = "uuid", unique = true, nullable = false)
+ private String uuid;
+
@Column(name = "FUNDING_CODE", length = 512, nullable = true)
private String fundingCode;
@@ -70,6 +63,15 @@ public class Sponsoring implements Serializable {
this.sponsoringId = sponsoringId;
}
+ @Override
+ public String getUuid() {
+ return uuid;
+ }
+
+ protected void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
public String getFundingCode() {
return fundingCode;
}
@@ -104,10 +106,10 @@ public class Sponsoring implements Serializable {
@Override
public int hashCode() {
-
int hash = 3;
hash = 53 * hash
+ (int) (sponsoringId ^ (sponsoringId >>> 32));
+ hash = 53 * hash + Objects.hashCode(uuid);
hash = 53 * hash + Objects.hashCode(fundingCode);
hash = 53 * hash + (int) (order ^ (order >>> 32));
hash = 53 * hash + CcmObjects.hashCodeUsingUuid(project);
@@ -117,7 +119,6 @@ public class Sponsoring implements Serializable {
@Override
public boolean equals(final Object obj) {
-
if (this == obj) {
return true;
}
@@ -134,6 +135,9 @@ public class Sponsoring implements Serializable {
if (sponsoringId != other.getSponsoringId()) {
return false;
}
+ if (!Objects.equals(uuid, other.getUuid())) {
+ return false;
+ }
if (!Objects.equals(fundingCode, other.getFundingCode())) {
return false;
}
@@ -145,16 +149,13 @@ public class Sponsoring implements Serializable {
}
return order == other.getOrder();
}
-
public boolean canEqual(final Object obj) {
-
return obj instanceof Sponsoring;
}
-
+
@Override
public final String toString() {
-
return toString("");
}
@@ -164,40 +165,48 @@ public class Sponsoring implements Serializable {
if (project == null) {
projectStr = "";
} else {
- projectStr = String.format("objectId = %d,"
- + "uuid = \"%s\", "
- + "name = \"%s\"",
- project.getObjectId(),
- project.getUuid(),
- project.getDisplayName());
+ projectStr = String.format(
+ "objectId = %d,"
+ + "uuid = \"%s\", "
+ + "name = \"%s\"",
+ project.getObjectId(),
+ project.getUuid(),
+ project.getDisplayName()
+ );
}
final String sponsorStr;
if (sponsor == null) {
sponsorStr = "";
} else {
- sponsorStr = String.format("objectId = %d, "
- + "uuid = \"%s\", "
- + "name = \"%s\"",
- sponsor.getObjectId(),
- sponsor.getUuid(),
- sponsor.getDisplayName());
+ sponsorStr = String.format(
+ "objectId = %d, "
+ + "uuid = \"%s\", "
+ + "name = \"%s\"",
+ sponsor.getObjectId(),
+ sponsor.getUuid(),
+ sponsor.getDisplayName()
+ );
}
- return String.format("%s{ "
- + "sponsoringId = %d, "
- + "fundingCode = \"%s\", "
- + "order = %d, "
- + "project = { %s }, "
- + "sponsor = { %s }%s"
- + " }",
- super.toString(),
- sponsoringId,
- fundingCode,
- order,
- projectStr,
- sponsorStr,
- data);
+ return String.format(
+ "%s{ "
+ + "sponsoringId = %d, "
+ + "uuid = %s, "
+ + "fundingCode = \"%s\", "
+ + "order = %d, "
+ + "project = { %s }, "
+ + "sponsor = { %s }%s"
+ + " }",
+ super.toString(),
+ sponsoringId,
+ uuid,
+ fundingCode,
+ order,
+ projectStr,
+ sponsorStr,
+ data
+ );
}
}
diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SponsoringImExporter.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SponsoringImExporter.java
new file mode 100644
index 0000000..9caa76a
--- /dev/null
+++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SponsoringImExporter.java
@@ -0,0 +1,61 @@
+package org.scientificcms.contenttypes.sciproject;
+
+import org.libreccm.imexport.AbstractEntityImExporter;
+import org.librecms.assets.Organization;
+import org.librecms.assets.Person;
+
+import java.util.Objects;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ * Importer/Exporter for {@link Membership} entities.
+ *
+ * @author Jens Pelzetter
+ */
+public class SponsoringImExporter
+ extends AbstractEntityImExporter {
+
+ @Inject
+ private SponsoringRepository sponsoringRepo;
+
+ @PostConstruct
+ @Override
+ protected void init() {
+ addRequiredEntities(
+ Set.of(
+ SciProject.class,
+ Organization.class
+ )
+ );
+ }
+
+ @Override
+ public Class getEntityClass() {
+ return Sponsoring.class;
+ }
+
+ @Override
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected void saveImportedEntity(final Sponsoring entity) {
+ sponsoringRepo.save(entity);
+ }
+
+ @Override
+ protected Sponsoring reloadEntity(final Sponsoring entity) {
+ return sponsoringRepo
+ .findById(entity.getSponsoringId())
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "Membership entity %s was not found in the database.",
+ Objects.toString(entity)
+ )
+ )
+ );
+ }
+
+}
diff --git a/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/h2/V7_0_0_1__add_uuids.sql b/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/h2/V7_0_0_1__add_uuids.sql
new file mode 100644
index 0000000..5aa6d88
--- /dev/null
+++ b/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/h2/V7_0_0_1__add_uuids.sql
@@ -0,0 +1,29 @@
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.PROJECT_CONTACTS set uuid = random_uuid();
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ add constraint UK_9uf8mpe319no9o4pgv3jtdm9d unique (uuid);
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS_AUD
+ add column uuid varchar(255);
+
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS set uuid = random_uuid();
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ add constraint UK_3ba40n70bpp8wlhhulmrr6e5h unique (uuid);
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS_AUD
+ add column uuid varchar(255);
+
+alter table SCI_TYPES_PROJECT.SPONSORING
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.SPONSORING set uuid = random_uuid();
+alter table SCI_TYPES_PROJECT.SPONSORING
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.SPONSORING
+ add constraint UK_b6rte13jrs2se6xad7eenr6mr unique(uuid);
+alter table SCI_TYPES_PROJECT.SPONSORING_AUD
+ add column uuid varchar(255);
\ No newline at end of file
diff --git a/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/pgsql/V7_0_0_1__add_uuids.sql b/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/pgsql/V7_0_0_1__add_uuids.sql
new file mode 100644
index 0000000..8a905be
--- /dev/null
+++ b/sci-types-project/src/main/resources/db/migrations/org/scientificcms/sci_types_project/pgsql/V7_0_0_1__add_uuids.sql
@@ -0,0 +1,29 @@
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.PROJECT_CONTACTS set uuid = gen_random_uuid();
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS
+ add constraint UK_9uf8mpe319no9o4pgv3jtdm9d unique (uuid);
+alter table SCI_TYPES_PROJECT.PROJECT_CONTACTS_AUD
+ add column uuid varchar(255);
+
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS set uuid = gen_random_uuid();
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS
+ add constraint UK_3ba40n70bpp8wlhhulmrr6e5h unique (uuid);
+alter table SCI_TYPES_PROJECT.PROJECT_MEMBERSHIPS_AUD
+ add column uuid varchar(255);
+
+alter table SCI_TYPES_PROJECT.SPONSORING
+ add column uuid varchar(255);
+update SCI_TYPES_PROJECT.SPONSORING set uuid = gen_random_uuid();
+alter table SCI_TYPES_PROJECT.SPONSORING
+ alter column uuid set not null;
+alter table SCI_TYPES_PROJECT.SPONSORING
+ add constraint UK_b6rte13jrs2se6xad7eenr6mr unique(uuid);
+alter table SCI_TYPES_PROJECT.SPONSORING_AUD
+ add column uuid varchar(255);
\ No newline at end of file