Могу ли я поместить аннотации для нескольких процессоров в класс Java? - PullRequest
1 голос
/ 23 июня 2009

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

@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.Channel@115c974 не является известным типом сущности», что обычно означает, что класс отсутствует в моем файле persistence.xml) и Мне интересно, будут ли аннотации мешать друг другу?

Ответы [ 2 ]

3 голосов
/ 25 июня 2009

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

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

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

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

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

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

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

0 голосов
/ 23 июня 2009

Нет, они не.

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...