[jboss-jira] [JBoss JIRA] Resolved: (JBRULES-2522) JPAVariablePersister will not work when @Id is declared on a superclass
Kris Verlaenen (JIRA)
jira-events at lists.jboss.org
Mon May 31 17:08:51 EDT 2010
[ https://jira.jboss.org/browse/JBRULES-2522?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kris Verlaenen resolved JBRULES-2522.
-------------------------------------
Assignee: Kris Verlaenen (was: Mark Proctor)
Fix Version/s: 5.1.0.CR1
Resolution: Done
Made sure that @Id on superclass method or field is also detected
> 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: Kris Verlaenen
> Fix For: 5.1.0.CR1
>
>
> 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