Pergunta

Eu não sou realmente certo como anotações realmente trabalho. Eu estou usando JAXB e JPA (com EclipseLink) nas mesmas classes, i. e. Recebo definições de classe como este:

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

Agora que estou recebendo erros estranhos (por exemplo "com.econemon.suite.common.models.Channel@115c974 não é um tipo entidade conhecida", o que geralmente significa que a classe não está no meu persistence.xml) e Eu estou querendo saber se as anotações irá interferir uns com os outros?

Foi útil?

Solução

Uma anotação não pode interferir uma outra anotação, esp. Não se o vieram de diferentes pacotes e têm nomes diferentes. Cada quadro (JAXB e Hibernate) tem lá próprias anotações. Cada introspect quadro somente lá próprias anotações. Estou muito certo de que este não é o problema aqui.

verifique a sua entidade tenha o seguinte:

a) nenhum construtor argumento (construtor padrão é bom, mas se você tiver apenas os construtores com argumentos, você deve fornecer uma nenhum construtor argumento para JPA, este pode ser protegido ou empacotar visível ....)

b) uma anotação @ ID em um campo ou getter (sempre usar anotações com base campo, caso contrário, nunca misture JPA anotação getter com anotação de campo em um tipo!)

c) o tipo está na sua unidade de persistência e sua unidade de persistência é usado

d) o tipo tem um @Entity anotação

Se você usar a herança (estende NamedEntity), você tem que dar mais JPA mais informações como você o que para mapear isso. No primeiro tentar remover o estende coisas NamedEntity. E do que olhar para uma boa JPA Tutorial que explica as variantes de herança.

Outras dicas

Não, eles não.

Eu removi todas as outras anotações e cortar a herança e acabou com uma classe muito simples. Problema permaneceu.

Uma coisa que não foi mencionado no meu post (porque eu pensei que não era relevante) era que eu estou correndo esta dentro de um contêiner OSGi (Felix se o que importa). Agora, uma escudos contêineres diferentes "pacotes" tais uns dos outros, para que eles não podem ver uns aos outros aulas para até especificamente pacotes "de exportação".

As classes anotadas estavam sentados em um pacote diferente do que a minha persistence.xml e eu assumi que eu poderia apenas importar as classes anotadas de outro pacote e fazer as coisas de inicialização persistência em outro lugar. Acontece que eu não posso, embora eu não tenha realmente entendido o porquê.

Então, se você estiver usando JPA em conjunto com pacotes OSGi, você tem que certificar-se de que:

  • classes anotadas e persistence.xml estão juntos no mesmo conjunto
  • Isso exporta pacote o pacote que contém as classes anotadas
  • a unidade (s) persistência são listados no arquivo de manifesto do pacote

Você pode então fazer as coisas persistência reais (como a chamada EntityManager.persist) em diferentes pacotes.

Como uma nota lateral, eu tenho erros semelhante estranhas ao tentar usar anotações JAXB através pacotes. Parece que o JAXBContext e / ou o ObjectFactory tem que ser instanciado no mesmo pacote que contém as classes anotadas. Eu não poderia realmente pregar isso para baixo, mas colocar as coisas no mesmo conjunto ajudou.

Seria ótimo se alguém com uma compreensão mais profunda da OSGi, carregamento e anotações de classe poderia comentar sobre o que pode estar acontecendo aqui.

Atualizar : exportar / importar os pacotes de anotação adequada pode permitir-lhe ter persistence.xml e classes anotadas em diferentes pacotes, consulte aqui . Não testei, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top