#java #inner-classes #persistence.xml
#java #внутренние классы #persistence.xml
Вопрос:
У меня есть внутренний класс:
@Entity
public class InnerTypes implements Serializable {
private static final long serialVersionUID = 3839105307661662120L;
@Id
public int id;
public PrimitiveInnerTypes primitiveInnerTypes;
public PrimitiveInnerTypes getPrimitiveInnerTypes() {
return primitiveInnerTypes;
}
public void setPrimitiveInnerTypes(PrimitiveInnerTypes primitiveInnerTypes) {
this.primitiveInnerTypes = primitiveInnerTypes;
}
@Entity
public static class PrimitiveInnerTypes implements Serializable {
//some code ...
}
}
У меня это на моем persistence.xml также
<class>pt.ptinovacao.persistencetester.model.InnerTypes$PrimitiveInnerTypes</class>
Используя знак $ (я думаю), я получаю следующее исключение:
[EL Warning]: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: unexpected token: INNERTYPES$PRIMITIVEINNERTYPES
Я не знаю, как исправить, если я изменю знак $ на a . Я не могу получить доступ к внутреннему классу, потому что . предназначен только для разных пакетов. Что я могу сделать?
Спасибо
Ответ №1:
Пункт 2.1 спецификаций JPA:
Класс сущности должен быть классом верхнего уровня.
Таким образом, вы не можете использовать вложенный класс для сущности. Сделайте его классом верхнего уровня.
Комментарии:
1. Однако, учитывая ошибку (an
SQLException
), я подозреваю, что EclipseLink допускает это, но базовая база данных не допускает$
в своих именах объектов. В этом случае решением было бы добавить явное имя.2. @MarkRotteveel: согласен. Но наиболее подходящее решение, ИМХО, по-прежнему заключается в том, чтобы сделать его классом верхнего уровня, чтобы соответствовать спецификации.
3. Я не знаю, смогу ли я изменить класс и сделать его классом верхнего уровня, но я поспрашиваю и попытаюсь это исправить. Спасибо всем