Posible error: la anotación Hibernate 4.3.5 @Lob no funciona en Postgres cuando se usa en un campo
Frecuentes
Visto 824 equipos
3
En una entidad si uso
@Lob
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
entonces el campo se crea en la base de datos como varchar(255)
Sin embargo, si uso así:
private String data;
@Lob
public String getData() {
return data;
}
@Lob
public void setData(String data) {
this.data = data;
}
entonces el campo se crea como text
en la base de datos.
Creo que en ambos casos debería ser text
en la base de datos.
@Target
para javax.persistence.Lob
is @Target(value={FIELD, METHOD})
así que creo que tal vez sea un error.
¿Es un error o conoce un documento que establece la diferencia?
Pieza pom.xml relacionada
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1004-jdbc41</version>
</dependency>
1 Respuestas
2
Lo más probable es que la anotación esté fuera de lugar en el primer caso. Es por eso que vuelve al valor predeterminado. No se admite la combinación de anotaciones de persistencia en captadores y campos sin avisar al proveedor de persistencia. Las anotaciones en setters nunca se consultan. Si eso es realmente necesario, entonces Tipo de acceso es la herramienta correcta.
Ejemplo:
@Entity
public class Box {
@Id
int id;
@Lob //here is right place because also 'id' does have annotation in field
String code;
@Lob //this annotation is ignored because 'id' does have annotation in field
//if getId() (instead of field) is one with annotation,
//then this is right place
public String getCode() {
return code;
}
@Lob // persistence annotation here is not at all supported
public void setCode(String code) {
this.code = code;
}
}
Hibernate usa la ubicación de la anotación @Id para determinar si es un campo o propiedad de tipo de acceso. De acuerdo con la especificación JPA 2.0, la ubicación inconsistente de la anotación simplemente no está en voz alta, por lo que no hay garantía de cómo debería comportarse:
Todas esas clases en la jerarquía de entidades cuyo tipo de acceso se establece de forma predeterminada de esta manera deben ser coherentes en la ubicación de las anotaciones en campos o propiedades, de modo que se aplique un único tipo de acceso predeterminado coherente dentro de la jerarquía.
Respondido el 13 de junio de 14 a las 19:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas hibernate postgresql jakarta-ee jpa postgresql-9.2 or haz tu propia pregunta.
Supongo que has entendido mal el caso aquí. En el primer ejemplo de código que di, la anotación es exactamente el mismo lugar en el que afirmas estar "bien", justo encima del campo. Así que no está fuera de lugar. ¿Me perdí algo? - épico
Sí, te perdiste mi suposición sobre el código que no se muestra en tu pregunta. El punto es que se deben anotar los campos o los atributos; no se admite la combinación de anotaciones en ambos. Mi suposición es que en su código, otros atributos persistentes tienen anotaciones de persistencia utilizadas para los métodos getter. Si es así, eso explica por qué se ignora la anotación @Lob para el campo, pero lo mismo funciona para getter. - mikko maunu
Oh, ahora veo. La cita de JPA lo dejó claro. ¡Muchas gracias! - épico