diff --git a/src/org/kar/archidata/dataAccess/DataAccess.java b/src/org/kar/archidata/dataAccess/DataAccess.java index 75a8778..b638a0f 100644 --- a/src/org/kar/archidata/dataAccess/DataAccess.java +++ b/src/org/kar/archidata/dataAccess/DataAccess.java @@ -250,6 +250,14 @@ public class DataAccess { return out; } + public static UUID getListOfRawUUID(final ResultSet rs, final int iii) throws SQLException, DataAccessException { + final byte[] elem = rs.getBytes(iii); + if (rs.wasNull()) { + return null; + } + return UuidUtils.asUuid(elem); + } + protected static void setValuedb( final Class type, final T data, diff --git a/src/org/kar/archidata/dataAccess/addOn/AddOnManyToOne.java b/src/org/kar/archidata/dataAccess/addOn/AddOnManyToOne.java index ad4d333..6881e4b 100644 --- a/src/org/kar/archidata/dataAccess/addOn/AddOnManyToOne.java +++ b/src/org/kar/archidata/dataAccess/addOn/AddOnManyToOne.java @@ -238,7 +238,11 @@ public class AddOnManyToOne implements DataAccessAddOn { if (dataNew != null && countNotNull.value != 0) { field.set(data, dataNew); } - } else { + return; + } + final Field remotePrimaryKeyField = AnnotationTools.getFieldOfId(objectClass); + final Class remotePrimaryKeyType = remotePrimaryKeyField.getType(); + if (remotePrimaryKeyType == Long.class) { // here we have the field, the data and the the remote value ==> can create callback that generate the update of the value ... final Long foreignKey = rs.getLong(count.value); count.inc(); @@ -254,6 +258,22 @@ public class AddOnManyToOne implements DataAccessAddOn { }; lazyCall.add(lambda); } + } else if (remotePrimaryKeyType == UUID.class) { + // here we have the field, the data and the the remote value ==> can create callback that generate the update of the value ... + final UUID foreignKey = DataAccess.getListOfRawUUID(rs, count.value); + count.inc(); + if (foreignKey != null) { + // In the lazy mode, the request is done in asynchronous mode, they will be done after... + final LazyGetter lambda = () -> { + // TODO: update to have get with abstract types .... + final Object foreignData = DataAccess.get(decorators.targetEntity(), foreignKey); + if (foreignData == null) { + return; + } + field.set(data, foreignData); + }; + lazyCall.add(lambda); + } } } } diff --git a/test/src/test/kar/archidata/TestManyToOne.java b/test/src/test/kar/archidata/TestManyToOne.java index db775f3..68f2dc7 100644 --- a/test/src/test/kar/archidata/TestManyToOne.java +++ b/test/src/test/kar/archidata/TestManyToOne.java @@ -22,6 +22,9 @@ import org.slf4j.LoggerFactory; import test.kar.archidata.model.TypeManyToOneRemote; import test.kar.archidata.model.TypeManyToOneRoot; import test.kar.archidata.model.TypeManyToOneRootExpand; +import test.kar.archidata.model.TypeManyToOneUUIDRemote; +import test.kar.archidata.model.TypeManyToOneUUIDRoot; +import test.kar.archidata.model.TypeManyToOneUUIDRootExpand; @ExtendWith(StepwiseExtension.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @@ -52,8 +55,9 @@ public class TestManyToOne { @Test public void testCreateTable() throws Exception { final List sqlCommand = DataFactory.createTable(TypeManyToOneRemote.class); - final List sqlCommand2 = DataFactory.createTable(TypeManyToOneRoot.class); - sqlCommand.addAll(sqlCommand2); + sqlCommand.addAll(DataFactory.createTable(TypeManyToOneRoot.class)); + sqlCommand.addAll(DataFactory.createTable(TypeManyToOneUUIDRoot.class)); + sqlCommand.addAll(DataFactory.createTable(TypeManyToOneUUIDRemote.class)); for (final String elem : sqlCommand) { LOGGER.debug("request: '{}'", elem); DataAccess.executeSimpleQuery(elem); @@ -62,7 +66,7 @@ public class TestManyToOne { @Order(2) @Test - public void testAddAlements() throws Exception { + public void testRemoteLong() throws Exception { TypeManyToOneRemote remote = new TypeManyToOneRemote(); remote.data = "remote1"; final TypeManyToOneRemote insertedRemote1 = DataAccess.insert(remote); @@ -119,4 +123,63 @@ public class TestManyToOne { Assertions.assertEquals(insertedData.otherData, retrieve2.otherData); Assertions.assertNull(retrieve2.remote); } + + @Order(3) + @Test + public void testRemoteUUID() throws Exception { + TypeManyToOneUUIDRemote remote = new TypeManyToOneUUIDRemote(); + remote.data = "remote1"; + final TypeManyToOneUUIDRemote insertedRemote1 = DataAccess.insert(remote); + Assertions.assertEquals(insertedRemote1.data, remote.data); + + remote = new TypeManyToOneUUIDRemote(); + remote.data = "remote2"; + final TypeManyToOneUUIDRemote insertedRemote2 = DataAccess.insert(remote); + Assertions.assertEquals(insertedRemote2.data, remote.data); + + final TypeManyToOneUUIDRoot test = new TypeManyToOneUUIDRoot(); + test.otherData = "kjhlkjlkj"; + test.remoteUuid = insertedRemote2.uuid; + final TypeManyToOneUUIDRoot insertedData = DataAccess.insert(test); + Assertions.assertNotNull(insertedData); + Assertions.assertNotNull(insertedData.uuid); + Assertions.assertEquals(test.otherData, insertedData.otherData); + Assertions.assertEquals(insertedRemote2.uuid, insertedData.remoteUuid); + + TypeManyToOneUUIDRoot retrieve = DataAccess.get(TypeManyToOneUUIDRoot.class, insertedData.uuid); + Assertions.assertNotNull(retrieve); + Assertions.assertNotNull(retrieve.uuid); + Assertions.assertEquals(insertedData.uuid, retrieve.uuid); + Assertions.assertEquals(insertedData.otherData, retrieve.otherData); + Assertions.assertEquals(insertedRemote2.uuid, retrieve.remoteUuid); + + TypeManyToOneUUIDRootExpand retrieve2 = DataAccess.get(TypeManyToOneUUIDRootExpand.class, insertedData.uuid); + Assertions.assertNotNull(retrieve2); + Assertions.assertNotNull(retrieve2.uuid); + Assertions.assertEquals(insertedData.uuid, retrieve2.uuid); + Assertions.assertEquals(insertedData.otherData, retrieve2.otherData); + Assertions.assertNotNull(retrieve2.remote); + Assertions.assertEquals(insertedRemote2.uuid, retrieve2.remote.uuid); + Assertions.assertEquals(insertedRemote2.data, retrieve2.remote.data); + + // remove values: + final int count = DataAccess.delete(TypeManyToOneUUIDRemote.class, remote.uuid); + Assertions.assertEquals(1, count); + + // check fail: + + retrieve = DataAccess.get(TypeManyToOneUUIDRoot.class, insertedData.uuid); + Assertions.assertNotNull(retrieve); + Assertions.assertNotNull(retrieve.uuid); + Assertions.assertEquals(insertedData.uuid, retrieve.uuid); + Assertions.assertEquals(insertedData.otherData, retrieve.otherData); + Assertions.assertEquals(insertedRemote2.uuid, retrieve.remoteUuid); + + retrieve2 = DataAccess.get(TypeManyToOneUUIDRootExpand.class, insertedData.uuid); + Assertions.assertNotNull(retrieve2); + Assertions.assertNotNull(retrieve2.uuid); + Assertions.assertEquals(insertedData.uuid, retrieve2.uuid); + Assertions.assertEquals(insertedData.otherData, retrieve2.otherData); + Assertions.assertNull(retrieve2.remote); + } } \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneRemote.java b/test/src/test/kar/archidata/model/TypeManyToOneRemote.java index 7491785..3e3036c 100644 --- a/test/src/test/kar/archidata/model/TypeManyToOneRemote.java +++ b/test/src/test/kar/archidata/model/TypeManyToOneRemote.java @@ -1,16 +1,14 @@ package test.kar.archidata.model; -import jakarta.persistence.Column; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import org.kar.archidata.model.GenericData; -public class TypeManyToOneRemote { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false, unique = true) - public Long id = null; +public class TypeManyToOneRemote extends GenericData { public String data; + @Override + public String toString() { + return "TypeManyToOneRemote [data=" + this.data + ", id=" + this.id + "]"; + } + } \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneRoot.java b/test/src/test/kar/archidata/model/TypeManyToOneRoot.java index d01cbd1..92a5444 100644 --- a/test/src/test/kar/archidata/model/TypeManyToOneRoot.java +++ b/test/src/test/kar/archidata/model/TypeManyToOneRoot.java @@ -1,20 +1,22 @@ package test.kar.archidata.model; +import org.kar.archidata.model.GenericData; + import jakarta.persistence.Column; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; -public class TypeManyToOneRoot { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false, unique = true) - public Long id = null; +public class TypeManyToOneRoot extends GenericData { public String otherData; @ManyToOne(targetEntity = TypeManyToOneRemote.class) @Column(nullable = false) public Long remoteId; + + @Override + public String toString() { + return "TypeManyToOneRoot [otherData=" + this.otherData + ", remoteId=" + this.remoteId + ", id=" + this.id + + "]"; + } + } \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneRootExpand.java b/test/src/test/kar/archidata/model/TypeManyToOneRootExpand.java index 8a1c20f..746fea1 100644 --- a/test/src/test/kar/archidata/model/TypeManyToOneRootExpand.java +++ b/test/src/test/kar/archidata/model/TypeManyToOneRootExpand.java @@ -1,23 +1,25 @@ package test.kar.archidata.model; +import org.kar.archidata.model.GenericData; + import jakarta.persistence.Column; import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; @Table(name = "TypeManyToOneRoot") -public class TypeManyToOneRootExpand { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false, unique = true) - public Long id = null; +public class TypeManyToOneRootExpand extends GenericData { public String otherData; @ManyToOne(fetch = FetchType.LAZY, targetEntity = TypeManyToOneRemote.class) @Column(name = "remoteId", nullable = false) public TypeManyToOneRemote remote; + + @Override + public String toString() { + return "TypeManyToOneRootExpand [otherData=" + this.otherData + ", remote=" + this.remote + ", id=" + this.id + + "]"; + } + } \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneUUIDRemote.java b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRemote.java new file mode 100644 index 0000000..9332827 --- /dev/null +++ b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRemote.java @@ -0,0 +1,9 @@ +package test.kar.archidata.model; + +import org.kar.archidata.model.UUIDGenericData; + +public class TypeManyToOneUUIDRemote extends UUIDGenericData { + + public String data; + +} \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneUUIDRoot.java b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRoot.java new file mode 100644 index 0000000..1064d2d --- /dev/null +++ b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRoot.java @@ -0,0 +1,17 @@ +package test.kar.archidata.model; + +import java.util.UUID; + +import org.kar.archidata.model.UUIDGenericData; + +import jakarta.persistence.Column; +import jakarta.persistence.ManyToOne; + +public class TypeManyToOneUUIDRoot extends UUIDGenericData { + + public String otherData; + + @ManyToOne(targetEntity = TypeManyToOneUUIDRemote.class) + @Column(nullable = false) + public UUID remoteUuid; +} \ No newline at end of file diff --git a/test/src/test/kar/archidata/model/TypeManyToOneUUIDRootExpand.java b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRootExpand.java new file mode 100644 index 0000000..56a0057 --- /dev/null +++ b/test/src/test/kar/archidata/model/TypeManyToOneUUIDRootExpand.java @@ -0,0 +1,18 @@ +package test.kar.archidata.model; + +import org.kar.archidata.model.UUIDGenericData; + +import jakarta.persistence.Column; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +@Table(name = "TypeManyToOneUUIDRoot") +public class TypeManyToOneUUIDRootExpand extends UUIDGenericData { + + public String otherData; + + @ManyToOne(fetch = FetchType.LAZY, targetEntity = TypeManyToOneUUIDRemote.class) + @Column(name = "remoteUuid", nullable = false) + public TypeManyToOneUUIDRemote remote; +} \ No newline at end of file