Skip to content

Commit eebf560

Browse files
Updated docs and implemented check for multiple versions and ids
1 parent 54745dd commit eebf560

File tree

7 files changed

+60
-130
lines changed

7 files changed

+60
-130
lines changed

docs/modules/ROOT/pages/features/ids.adoc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,14 @@
66
* ``long`` / ``Long``
77
* ``String``
88
* ``UUID``
9+
10+
Other generation types are currently not supported.
11+
12+
== Composite keys
13+
14+
It is possible to use **any class as https://jakarta.ee/specifications/persistence/3.2/apidocs/jakarta.persistence/jakarta/persistence/id[``@Id``]** but without any auto generation.
15+
Most importantly the used class **must have a valid ``hashCode``** since a ``HashMap`` is used to store and manage entities.
16+
17+
{product-name} can also handle https://jakarta.ee/specifications/persistence/3.2/apidocs/jakarta.persistence/jakarta/persistence/embeddedid[``@EmbeddedId``] which results in the same behavior as ``@Id`` but the id-class must then implement ``Serializable``.
18+
19+
Multiple Ids for a single entity and https://jakarta.ee/specifications/persistence/3.2/apidocs/jakarta.persistence/jakarta/persistence/idclass[``@IdClass``] are **not** supported.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.exceptions;
1717

18-
public class IdFieldFinalException extends RuntimeException
18+
public class IdFieldException extends RuntimeException
1919
{
20-
public IdFieldFinalException(final String message)
20+
public IdFieldException(final String message)
2121
{
2222
super(message);
2323
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/AnnotatedFieldFinder.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,17 @@
1717

1818
import java.lang.annotation.Annotation;
1919
import java.lang.reflect.Field;
20+
import java.util.ArrayList;
2021
import java.util.Collection;
2122
import java.util.List;
2223
import java.util.Optional;
2324

25+
import jakarta.persistence.EmbeddedId;
26+
import jakarta.persistence.Id;
27+
import jakarta.persistence.Version;
28+
29+
import software.xdev.spring.data.eclipse.store.exceptions.IdFieldException;
30+
import software.xdev.spring.data.eclipse.store.exceptions.InvalidVersionException;
2431
import software.xdev.spring.data.eclipse.store.repository.access.AccessHelper;
2532

2633

@@ -39,13 +46,26 @@ private AnnotatedFieldFinder()
3946
*/
4047
public static Optional<Field> findIdField(final Class<?> domainClass)
4148
{
42-
return findAnnotatedField(
49+
final List<Field> idFields = findAnnotatedFields(
4350
domainClass,
4451
List.of(
45-
jakarta.persistence.Id.class,
52+
Id.class,
4653
org.springframework.data.annotation.Id.class,
47-
jakarta.persistence.EmbeddedId.class)
54+
EmbeddedId.class)
4855
);
56+
57+
if(idFields.isEmpty())
58+
{
59+
return Optional.empty();
60+
}
61+
else
62+
{
63+
if(idFields.size() > 1)
64+
{
65+
throw new IdFieldException("Only one id field is allowed");
66+
}
67+
return Optional.of(idFields.get(0));
68+
}
4969
}
5070

5171
/**
@@ -56,32 +76,46 @@ public static Optional<Field> findIdField(final Class<?> domainClass)
5676
*/
5777
public static Optional<Field> findVersionField(final Class<?> domainClass)
5878
{
59-
return findAnnotatedField(
79+
final List<Field> versionFields = findAnnotatedFields(
6080
domainClass,
61-
List.of(jakarta.persistence.Version.class, org.springframework.data.annotation.Version.class)
81+
List.of(Version.class, org.springframework.data.annotation.Version.class)
6282
);
83+
84+
if(versionFields.isEmpty())
85+
{
86+
return Optional.empty();
87+
}
88+
else
89+
{
90+
if(versionFields.size() > 1)
91+
{
92+
throw new InvalidVersionException("Only one version field is allowed");
93+
}
94+
return Optional.of(versionFields.get(0));
95+
}
6396
}
6497

6598
/**
6699
* Finds any field in a class with specified annotations. Finds this field recursively in the Hierarchy-tree.
67100
*
68-
* @return field with annotation. Is {@link Optional#empty()} if no field was found.
101+
* @return fields with annotation.
69102
*/
70-
public static Optional<Field> findAnnotatedField(
103+
public static List<Field> findAnnotatedFields(
71104
final Class<?> domainClass,
72105
final Collection<Class<? extends Annotation>> annotations)
73106
{
107+
final ArrayList<Field> foundFields = new ArrayList<>();
74108
final Collection<Field> classFields = AccessHelper.getInheritedPrivateFieldsByName(domainClass).values();
75109
for(final Field currentField : classFields)
76110
{
77111
for(final Class<? extends Annotation> annotation : annotations)
78112
{
79113
if(currentField.getAnnotationsByType(annotation).length > 0)
80114
{
81-
return Optional.of(currentField);
115+
foundFields.add(currentField);
82116
}
83117
}
84118
}
85-
return Optional.empty();
119+
return foundFields;
86120
}
87121
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/version/SimpleEntityVersionIncrementer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.lang.reflect.Modifier;
2020

2121
import software.xdev.spring.data.eclipse.store.exceptions.FieldAccessReflectionException;
22-
import software.xdev.spring.data.eclipse.store.exceptions.IdFieldFinalException;
22+
import software.xdev.spring.data.eclipse.store.exceptions.IdFieldException;
2323
import software.xdev.spring.data.eclipse.store.repository.access.modifier.FieldAccessModifier;
2424
import software.xdev.spring.data.eclipse.store.repository.support.copier.version.incrementer.VersionIncrementer;
2525

@@ -43,7 +43,7 @@ private void checkIfVersionFieldIsFinal()
4343
final int fieldModifiers = this.versionField.getModifiers();
4444
if(Modifier.isFinal(fieldModifiers))
4545
{
46-
throw new IdFieldFinalException(String.format(
46+
throw new IdFieldException(String.format(
4747
"Field %s is final and cannot be modified. Version fields must not be final.",
4848
this.versionField.getName()));
4949
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/id/SimpleIdSetter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.util.function.Consumer;
2121

2222
import software.xdev.spring.data.eclipse.store.exceptions.FieldAccessReflectionException;
23-
import software.xdev.spring.data.eclipse.store.exceptions.IdFieldFinalException;
23+
import software.xdev.spring.data.eclipse.store.exceptions.IdFieldException;
2424
import software.xdev.spring.data.eclipse.store.repository.access.modifier.FieldAccessModifier;
2525
import software.xdev.spring.data.eclipse.store.repository.support.id.strategy.IdFinder;
2626

@@ -45,7 +45,7 @@ private void checkIfIdFieldIsFinal()
4545
final int fieldModifiers = this.idField.getModifiers();
4646
if(Modifier.isFinal(fieldModifiers))
4747
{
48-
throw new IdFieldFinalException(String.format(
48+
throw new IdFieldException(String.format(
4949
"Field %s is final and cannot be modified. ID fields must not be final.",
5050
this.idField.getName()));
5151
}

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/model/CustomerWithMultipleId.java

Lines changed: 0 additions & 92 deletions
This file was deleted.

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/model/CustomerWithMultipleIdRepository.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)