[
https://jira.jboss.org/browse/JBRULES-2522?page=com.atlassian.jira.plugin...
]
Julien Serdaru updated JBRULES-2522:
------------------------------------
Description:
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, a lookup is done on the entity fields to
autodetect the @Id annotation, which fails in this case since the annotation is declared
on the superclass.
I tested the following implementation of getClassIdValue to work:
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;
}
was:
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, a lookup is done on the entity fields to
autodetect the @Id annotation, which fails in this case since the method uses
getDeclaredFields() instead of getFields():
private Long getClassIdValue(Object o) throws NoSuchMethodException,
SecurityException, IllegalAccessException,
InvocationTargetException, IllegalArgumentException {
Field[] fields = o.getClass().getDeclaredFields(); <-- THIS ONLY RETURNS THE LOCAL
FIELDS, NOT THE SUPERCLASS.
...
return idValue;
}
Replacing getDeclaredFields() by getFields() should fix the problem.
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)
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, a lookup is done on the entity fields to
autodetect the @Id annotation, which fails in this case since the annotation is declared
on the superclass.
I tested the following implementation of getClassIdValue to work:
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;
}
--
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