Annotera ID

2 views
Skip to first unread message

Anders Asplund

unread,
Nov 25, 2010, 6:17:50 AM11/25/10
to oppna-program-dao-framework
Inspirerad av länken jag skickade i annan tråd hackade jag ihop
följande konceptuella förslag för hur man kan förenkla hanteringen av
entitetens ID. Vad tror ni, är det något att bygga vidare på?

InIndex: types/src/main/java/se/vgregion/dao/domain/patterns/entity/
AbstractEntity.java
===================================================================
--- types/src/main/java/se/vgregion/dao/domain/patterns/entity/
AbstractEntity.java (revision 70)
+++ types/src/main/java/se/vgregion/dao/domain/patterns/entity/
AbstractEntity.java (working copy)
@@ -4,6 +4,8 @@
*/
package se.vgregion.dao.domain.patterns.entity;

+import java.lang.reflect.Field;
+
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

@@ -70,4 +72,29 @@
return ToStringBuilder.reflectionToString(this);
}

+ public ID getId() {
+ try {
+ return (ID) findDomainSignature().get(this);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private Field findDomainSignature() {
+ Field[] fields = getClass().getDeclaredFields();
+ for (Field currentField : fields) {
+ currentField.setAccessible(true);
+ try {
+ if
(currentField.isAnnotationPresent(DomainSignature.class)) {
+ return currentField;
+ }
+ } catch (IllegalArgumentException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return null;
+ }
}
Index: types/src/main/java/se/vgregion/dao/domain/patterns/entity/
DomainSignature.java
===================================================================
--- types/src/main/java/se/vgregion/dao/domain/patterns/entity/
DomainSignature.java (revision 0)
+++ types/src/main/java/se/vgregion/dao/domain/patterns/entity/
DomainSignature.java (revision 0)
@@ -0,0 +1,12 @@
+package se.vgregion.dao.domain.patterns.entity;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface DomainSignature {
+
+}
Index: types-jpa/src/test/java/se/vgregion/dao/domain/patterns/
Car.java
===================================================================
--- types-jpa/src/test/java/se/vgregion/dao/domain/patterns/Car.java
(revision 0)
+++ types-jpa/src/test/java/se/vgregion/dao/domain/patterns/Car.java
(revision 0)
@@ -0,0 +1,22 @@
+package se.vgregion.dao.domain.patterns;
+
+import java.util.UUID;
+
+import javax.persistence.Entity;
+
+import se.vgregion.dao.domain.patterns.entity.DomainSignature;
+
+@Entity
+public class Car extends AbstractVehicle<Car> {
+
+ @DomainSignature
+ private UUID id;
+
+ public Car() {
+ id = UUID.randomUUID();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(new Car());
+ }
+}

Niklas Gustavsson

unread,
Nov 25, 2010, 6:42:20 AM11/25/10
to oppna-program...@googlegroups.com
On Thu, Nov 25, 2010 at 12:17 PM, Anders Asplund <aasp...@gmail.com> wrote:
> Inspirerad av länken jag skickade i annan tråd hackade jag ihop
> följande konceptuella förslag för hur man kan förenkla hanteringen av
> entitetens ID. Vad tror ni, är det något att bygga vidare på?

Ser ohyggligt komplicerat ut för att lösa något enkelt.

/niklas

Anders Asplund

unread,
Nov 25, 2010, 6:59:37 AM11/25/10
to oppna-program...@googlegroups.com

> Ser ohyggligt komplicerat ut för att lösa något enkelt.
Vet inte om det finns ett enklare sätt att lösa upp annoteringar men tanken med förslaget vart inte att visa hur man gör detta utan snarare att man mha en annotering kan deklarera vilket attribut som är entitetens id. På så sätt slipper varje entitet att implementera getID och man minskar därmed boilerplate samt ökar tydligheten i entiteten.

Det hindrar dock inte en entitet från att själv implementera getID om man skulle vilja.


//Anders

Niklas Gustavsson

unread,
Nov 25, 2010, 7:14:35 AM11/25/10
to oppna-program...@googlegroups.com
2010/11/25 Anders Asplund <aasp...@gmail.com>:

>
>> Ser ohyggligt komplicerat ut för att lösa något enkelt.
> Vet inte om det finns ett enklare sätt att lösa upp annoteringar men tanken med förslaget vart inte att visa hur man gör detta utan snarare att man mha en annotering kan deklarera vilket attribut som är entitetens id. På så sätt slipper varje entitet att implementera getID och man minskar därmed boilerplate samt ökar tydligheten i entiteten.

Min kritik var inte mot sättet att lösa upp annoteringen, utan mot att
använda annotering. Jag ser inte att den löser vårt problem, dvs att
man kan råka introducera en bugg där identieten blir null. Jag ser
(utifrån egen erfarenhet) att detta beror på två olika buggar:
* Man blandar samman PK och ID och får du klassar som inte
persisterats och därmed har ett null ID. Här behöver som sagt
Javadocen vara mycket tydligare med vad skillnaden är.
* Man sätter inte IDt korrekt

Ser som sagt inte att annotering löser endera problem.

/niklas

Anders Asplund

unread,
Nov 25, 2010, 7:22:26 AM11/25/10
to oppna-program...@googlegroups.com
> Ser som sagt inte att annotering löser endera problem.
Det var inte min avsikt heller utan ett sidospår därav den separata tråden :-). Men vi kan vänta med detta tills våra andra "problem" är lösta.
Reply all
Reply to author
Forward
0 new messages