Я обнаружил проблему, и она является частью метода checkForOrphanProperties в JPAOverridenAnnotationReader:
for (Method method : clazz.getMethods()) {
String name = method.getName();
if ( name.startsWith( "get" ) ) {
properties.add( Introspector.decapitalize( name.substring( "get".length() ) ) );
}
else if ( name.startsWith( "is" ) ) {
properties.add( Introspector.decapitalize( name.substring( "is".length() ) ) );
}
}
Проблема в том, что метод ищет все открытые поля, а затем начинает добавлять имена полей на основе методов "get" и "is", которые он находит. Метод Introspector.decapitalize использует специальные правила для определения того, что нужно декапитализировать.
Из класса Introspector:
/**
* Utility method to take a string and convert it to normal Java variable
* name capitalization. This normally means converting the first
* character from upper case to lower case, but in the (unusual) special
* case when there is more than one character and both the first and
* second characters are upper case, we leave it alone.
* <p>
* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
* as "URL".
*
* @param name The string to be decapitalized.
* @return The decapitalized version of the string.
*/
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
Так, например, наше поле:
private String eAddress;
И наш получатель:
public String getEAddress() {
return eAddress;
}
Таким образом, в зависимости от функциональности Introspector.decapitalize, результатом декапитализации будет «EAddress», а не «eAddress». Поскольку он видит две заглавные буквы в «EAddress», когда код подстрокует от «get» ... он не будет декапитализирован. Поэтому он жалуется, что поле eAddress в orm.xml не существует. Постоянство поля работает совершенно нормально, эти предупреждения просто появляются, когда начинается война и файлы загружаются.