Pregunta

No estoy realmente seguro de cómo funcionan realmente las anotaciones. Estoy usando JAXB y JPA (con eclipselink) en las mismas clases, i. mi. Obtengo definiciones de clase como esta:

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

Ahora recibo errores extraños (por ejemplo, "com.econemon.suite.common.models.Channel@115c974 no es un tipo de entidad conocido", lo que generalmente significa que la clase no está en mi persistencia.xml) y me pregunto si las anotaciones interferirán entre sí

¿Fue útil?

Solución

Una anotación no puede interferir con otra anotación, especialmente. no si vinieron de paquetes diferentes y tienen nombres diferentes. Cada marco (JAXB e Hibernate) tiene sus propias anotaciones. Cada marco introspectivo solo tiene sus propias anotaciones. Estoy muy seguro de que este no es el problema aquí.

compruebe su entidad para tener esto:

a) constructor sin argumentos (el constructor predeterminado está bien, pero si solo tiene constructores con argumentos, debe proporcionar un constructor sin argumentos a JPA, esto se puede proteger o paquete visible ...)

b) una anotación @Id en un campo o getter (siempre usamos anotaciones basadas en campos, de lo contrario nunca mezclemos la anotación JPA getter con la anotación de campo en un tipo)

c) el tipo está en su unidad de persistencia y se usa su unidad de persistencia

d) el tipo tiene una Anotación @Entity

si usa la herencia (extiende NamedEntity), debe proporcionar más JPA más información sobre cómo asignar esto. Al principio intente eliminar el material extendido NamedEntity. Y luego mire un buen tutorial de JPA que explica las variantes de herencia.

Otros consejos

No, no lo hacen.

Eliminé todas las otras anotaciones y corté la herencia y terminé con una clase muy simple. El problema persiste.

Una cosa que no se mencionó en mi publicación (porque pensé que no era relevante) fue que estoy ejecutando esto dentro de un contenedor OSGi (Felix si eso importa). Ahora, dicho contenedor protege diferentes '' paquetes '' el uno del otro, por lo que no pueden ver las clases del otro hasta que específicamente "exportar" paquetes.

Las clases anotadas se encontraban en un paquete diferente a mi persistence.xml y supuse que podía importar las clases anotadas de otro paquete y hacer las cosas de inicio de persistencia en otro lugar. Resulta que no puedo, aunque realmente no he entendido por qué.

Entonces, si está utilizando JPA junto con paquetes OSGi, debe asegurarse de que:

  • Las clases anotadas y persistence.xml están juntas en el mismo paquete
  • este paquete exporta el paquete que contiene las clases anotadas
  • las unidades de persistencia se enumeran en el archivo de manifiesto del paquete

Puede hacer las cosas de persistencia real (como llamar a EntityManager.persist) en diferentes paquetes.

Como nota al margen, obtuve errores igualmente extraños al intentar usar anotaciones JAXB en paquetes. Parece que JAXBContext y / o ObjectFactory deben ser instanciados en el mismo paquete que contiene las clases anotadas. Realmente no pude aclarar esto, pero poner las cosas en el mismo paquete ayudó.

Sería genial si alguien con un conocimiento más profundo de OSGi, carga de clase y anotaciones pudiera comentar sobre lo que podría estar sucediendo aquí.

Actualización : exportar / importar los paquetes de anotaciones adecuados podría permitirle tener persistence.xml y clases anotadas en diferentes paquetes, consulte aquí . Sin embargo, no lo he probado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top