diff --git a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java index 62032b642074fa85bbb52f95462e6c9e24f7ee71..3ce1c7a1bed2e4ed0d5119d5e8c9bf36eccc5562 100644 --- a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java +++ b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java @@ -123,8 +123,6 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest { assertEquals(IDENTIFIER_2_TITLE, response.getTitle()); assertEquals(IDENTIFIER_2_DESCRIPTION, response.getDescription()); assertEquals(2, response.getCreators().size()); - assertEquals(1, response.getRelatedIdentifiers().size()); - assertEquals(IDENTIFIER_2_ID, response.getRelatedIdentifiers().get(0).getIdentifier().getId()); } @Test diff --git a/fda-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RelatedIdentifierRepository.java b/fda-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RelatedIdentifierRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..4e735007ab69f5ca5b6c9e1e4fa0007a4cbeb3a3 --- /dev/null +++ b/fda-identifier-service/services/src/main/java/at/tuwien/repository/jpa/RelatedIdentifierRepository.java @@ -0,0 +1,11 @@ +package at.tuwien.repository.jpa; + +import at.tuwien.entities.identifier.RelatedIdentifier; +import at.tuwien.entities.identifier.RelatedIdentifierKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RelatedIdentifierRepository extends JpaRepository<RelatedIdentifier, RelatedIdentifierKey> { + +} diff --git a/fda-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/fda-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java index 6577195e2b7393a1ccdbe30afe9c37980f5c3d96..f96736a2e8c772446a74cb099d8e75b17873464f 100644 --- a/fda-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java +++ b/fda-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java @@ -16,6 +16,7 @@ import at.tuwien.gateway.QueryServiceGateway; import at.tuwien.mapper.DocumentMapper; import at.tuwien.mapper.IdentifierMapper; import at.tuwien.repository.jpa.IdentifierRepository; +import at.tuwien.repository.jpa.RelatedIdentifierRepository; import at.tuwien.service.DatabaseService; import at.tuwien.service.IdentifierService; import at.tuwien.service.UserService; @@ -39,16 +40,19 @@ public class IdentifierServiceImpl implements IdentifierService { private final IdentifierMapper identifierMapper; private final QueryServiceGateway queryServiceGateway; private final IdentifierRepository identifierRepository; + private final RelatedIdentifierRepository relatedIdentifierRepository; public IdentifierServiceImpl(UserService userService, DocumentMapper documentMapper, DatabaseService databaseService, IdentifierMapper identifierMapper, - QueryServiceGateway queryServiceGateway, IdentifierRepository identifierRepository) { + QueryServiceGateway queryServiceGateway, IdentifierRepository identifierRepository, + RelatedIdentifierRepository relatedIdentifierRepository) { this.userService = userService; this.documentMapper = documentMapper; this.databaseService = databaseService; this.identifierMapper = identifierMapper; this.queryServiceGateway = queryServiceGateway; this.identifierRepository = identifierRepository; + this.relatedIdentifierRepository = relatedIdentifierRepository; } @Override @@ -114,15 +118,13 @@ public class IdentifierServiceImpl implements IdentifierService { }) .collect(Collectors.toList())); if (data.getRelatedIdentifiers() != null) { - entity.setRelatedIdentifiers(data.getRelatedIdentifiers() - .stream() - .map(r -> { + data.getRelatedIdentifiers() + .forEach(r -> { final RelatedIdentifier id = identifierMapper.relatedIdentifierCreateDtoToRelatedIdentifier(r); - id.setIdentifier(entity); + id.setIid(entity.getId()); id.setCreator(creator); - return id; - }) - .collect(Collectors.toList())); + relatedIdentifierRepository.save(id); + }); } final Identifier identifier = identifierRepository.save(entity); log.info("Created identifier with id {}", identifier.getId()); diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java index 54cd3db2f7951757838422e8aa308cc9f4ec0579..b4539dfd45fcfdc80395bb991ef4fdbdb3613de7 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java @@ -84,9 +84,6 @@ public class Identifier { }) private Database database; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "identifier") - private List<RelatedIdentifier> relatedIdentifiers; - @Column(nullable = false, columnDefinition = "enum('EVERYONE', 'TRUSTED', 'SELF')") @Enumerated(EnumType.STRING) private VisibilityType visibility = VisibilityType.SELF; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java index 90e22a1d1d922ae0dc6c8a415bed4eaf25b17a7a..01ec086b6a3b540eb421c9003c41574730934c87 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java @@ -18,15 +18,17 @@ import java.time.Instant; @ToString @AllArgsConstructor @NoArgsConstructor +@IdClass(RelatedIdentifierKey.class) @Where(clause = "deleted is null") +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @EntityListeners(AuditingEntityListener.class) -@SQLDelete(sql = "update mdb_related_identifiers set deleted = NOW() where id = ?") -@Table(name = "mdb_related_identifiers") +@Table(name = "mdb_related_identifiers", uniqueConstraints = { + @UniqueConstraint(columnNames = {"id", "iid"}) +}) public class RelatedIdentifier { @Id @EqualsAndHashCode.Include - @ToString.Include @GeneratedValue(generator = "related-identifier-sequence") @GenericGenerator( name = "related-identifier-sequence", @@ -35,6 +37,10 @@ public class RelatedIdentifier { ) private Long id; + @Id + @EqualsAndHashCode.Include + private Long iid; + @Column(nullable = false) private String value; @@ -52,13 +58,6 @@ public class RelatedIdentifier { }) private User creator; - @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) - @JoinColumns({ - @JoinColumn(name = "identifier_id", referencedColumnName = "id") - }) - private Identifier identifier; - @Column(nullable = false, updatable = false) @CreatedDate private Instant created; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifierKey.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifierKey.java new file mode 100644 index 0000000000000000000000000000000000000000..d992225c9d7e34e76cb6ac7d70ec285494098fd4 --- /dev/null +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifierKey.java @@ -0,0 +1,14 @@ +package at.tuwien.entities.identifier; + +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode +public class RelatedIdentifierKey implements Serializable { + + private Long id; + + private Long iid; + +} diff --git a/fda-metadata-db/setup-schema.sql b/fda-metadata-db/setup-schema.sql index 8bd8a1da2f7c1e4205deae396fa636ac17bdc5de..1aafd0a15132ae6a4a2090bea626d2bd1ca9d730 100644 --- a/fda-metadata-db/setup-schema.sql +++ b/fda-metadata-db/setup-schema.sql @@ -478,7 +478,7 @@ CREATE TABLE IF NOT EXISTS mdb_identifiers CREATE TABLE IF NOT EXISTS mdb_related_identifiers ( id bigint DEFAULT nextval('mdb_related_identifiers_seq'), - identifier_id bigint NOT NULL, + iid bigint NOT NULL, value text NOT NULL, type varchar(255), relation varchar(255), @@ -486,8 +486,8 @@ CREATE TABLE IF NOT EXISTS mdb_related_identifiers created_by bigint NOT NULL, last_modified timestamp without time zone, deleted timestamp without time zone, - PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ - FOREIGN KEY (identifier_id) REFERENCES mdb_identifiers (id), + PRIMARY KEY (id, iid), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (iid) REFERENCES mdb_identifiers (id), FOREIGN KEY (created_by) REFERENCES mdb_users (UserID) );