Внутренний класс — неожиданный токен

#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. Я не знаю, смогу ли я изменить класс и сделать его классом верхнего уровня, но я поспрашиваю и попытаюсь это исправить. Спасибо всем