[jboss-jira] [JBoss JIRA] Updated: (JBRULES-2522) JPAVariablePersister will not work when @Id is declared on a superclass

Julien Serdaru (JIRA) jira-events at lists.jboss.org
Thu May 27 09:51:08 EDT 2010


     [ https://jira.jboss.org/browse/JBRULES-2522?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Julien Serdaru updated JBRULES-2522:
------------------------------------

    Component/s: drools-process


> JPAVariablePersister will not work when @Id is declared on a superclass
> -----------------------------------------------------------------------
>
>                 Key: JBRULES-2522
>                 URL: https://jira.jboss.org/browse/JBRULES-2522
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: drools-process
>    Affects Versions: 5.1.0.M1
>            Reporter: Julien Serdaru
>            Assignee: Mark Proctor
>
> Given A and B:
> @MappedSuperclass
> public class A {
>     @Id
>     @GeneratedValue(strategy = GenerationType.AUTO)
>     private Long id = null;
> }
> @Entity
> public class B extends A {
>     // Some other fields
> }
> In JPAVariablePersister:getClassIdValue, the code introspects the entity class to autodetect the @Id annotation. The code fails in this case since the annotation is declared on the superclass, and the current implementation only loops on the local fields of class B.
> I tested the following implementation of getClassIdValue to work (loop on parent class objects)
>     private Long getClassIdValue(Object o)
>             throws NoSuchMethodException, SecurityException,
>             IllegalAccessException, InvocationTargetException,
>             IllegalArgumentException {
>         Class<?> c = o.getClass();
>         Long idValue = null;
>         do {
>             Field fields[] = c.getDeclaredFields();
>             for (int i = 0; i < fields.length; i++) {
>                 Id id = fields[i].getAnnotation(Id.class);
>                 if (id != null) {
>                     idValue = (Long) o.getClass().getMethod(
>                             "get"
>                                     + Character.toUpperCase(fields[i]
>                                             .getName().charAt(0))
>                                     + fields[i].getName().substring(1),
>                             new Class<?>[] {}).invoke(o,
>                             new Object[] {});
>                     break;
>                 }
>             }
>         } while ((c = c.getSuperclass()) != null && idValue == null);
>         return idValue;
>     }
> Actually this type of code should probably deserve a service function somewhere...

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the jboss-jira mailing list