2009-06-23 6 views
1

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

@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... 
} 

Теперь я получаю странные ошибки (например, «[email protected] не известно типа объекта», который обычно означает, что класс не в моем persistence.xml), и мне интересно, будут ли аннотации мешать друг другу?

ответ

3

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

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

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

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

с) типом вашей настойчивости блок и ваша настойчивость блок используется

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

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

+0

+1 для контрольного списка, это в целом весьма полезно. Тем не менее, я уже работал над этим, прежде чем я опубликовал. Я, наконец, решил, что это проблема с загрузкой класса, которую я до сих пор не понимаю, но все равно смог решить/обойти. Также см. Мой собственный ответ. –

0

Нет, они этого не делают.

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

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

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

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

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

затем вы можете сделать фактические постоянство вещи (как вызов Ent ityManager.persist) в разных пакетах.

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

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

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