Могу ли я поместить аннотации для нескольких процессоров в класс Java?

StackOverflow https://stackoverflow.com/questions/1034132

  •  06-07-2019
  •  | 
  •  

Вопрос

Я не совсем уверен, как на самом деле работают аннотации.Я использую JAXB и JPA (с eclipselink) в одних и тех же классах, i.e.Я получаю определения классов следующим образом:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Channel")
@Entity
public class Channel extends NamedEntity {
    @XmlAttribute
    @XmlSchemaType(name = "anyURI")
    @Column(name="url")
    protected String url;

    @XmlAttribute
    @Column
    protected String coDirection;
    // etc...
}

Теперь я получаю странные ошибки (например, "com.econemon.suite.common.models.Канал @115c974 не является известным типом объекта ", что обычно означает, что класса нет в моем persistence.xml) и мне интересно, будут ли аннотации мешать друг другу?

Это было полезно?

Решение

Аннотация не может мешать другой аннотации, особенно нет, если пришли из разных пакетов и имеют разные имена. У каждого фреймворка (JAXB и Hibernate) есть свои аннотации. Каждый фреймворк интроспективный, только там свои аннотации. Я очень уверен, что это не проблема здесь.

пожалуйста, проверьте свою сущность, чтобы иметь это:

a) конструктор аргументов отсутствует (конструктор по умолчанию в порядке, но если у вас есть только конструкторы с аргументами, необходимо предоставить конструктор аргументов без JPA, это можно защитить или сделать видимым в пакете ....)

b) аннотация @Id для поля или получателя (мы всегда используем аннотации на основе полей, в противном случае никогда не смешивайте аннотацию получателя JPA с аннотацией поля в типе!)

в) тип указан в вашей единице персистентности, а ваша единица персистентности используется

d) тип имеет аннотацию @Entity

если вы используете наследование (расширяет NamedEntity), вы должны предоставить JPA больше информации о том, как это отобразить. Сначала попробуйте удалить расширения NamedEntity. А затем взгляните на хороший учебник JPA, который объясняет варианты наследования.

Другие советы

Нет, это не так.

Я удалил все остальные аннотации и сократил наследование, в результате чего получился очень простой класс.Проблема оставалась.

Вещь, которая не была упомянута в моем посте (потому что я думал, что это не имеет отношения к делу), заключалась в том, что я запускаю это внутри контейнера OSGi (Felix, если это имеет значение).Теперь такой контейнер защищает разные "пакеты" друг от друга, поэтому они не могут видеть классы друг друга, пока вы специально не "экспортируете" пакеты.

Аннотированные классы находились в пакете, отличном от моего persistence.xml и я предположил, что могу просто импортировать аннотированные классы из другого пакета и выполнить процедуру инициализации сохранения в другом месте.Оказывается, я не могу, хотя на самом деле и не понимаю почему.

Итак, если вы используете JPA в сочетании с пакетами OSGi, вы должны убедиться, что:

  • Аннотированные классы и persistence.xml находятся вместе в одном пакете
  • этот пакет экспортирует пакет, содержащий аннотированные классы
  • единицы измерения сохраняемости перечислены в файле манифеста пакета

Затем вы можете выполнять фактические действия с сохранением (например, вызывать EntityManager.persist) в разных пакетах.

В качестве дополнительного примечания я получил точно такие же странные ошибки при попытке использовать аннотации JAXB во всех пакетах.Похоже, что JAXBContext и / или ObjectFactory должны быть созданы в том же пакете, который содержит аннотированные классы.Я не мог по-настоящему разобраться в этом, но объединение вещей в один пакет помогло.

Было бы здорово, если бы кто-нибудь с более глубоким пониманием OSGi, загрузки классов и аннотаций мог прокомментировать, что здесь может происходить.

Обновить:экспорт / импорт соответствующих пакетов аннотаций может позволить вам иметь persistence.xml и аннотированные классы в разных пакетах, см. здесь.Хотя я еще не проверял.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top