Posible error: la anotación Hibernate 4.3.5 @Lob no funciona en Postgres cuando se usa en un campo

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>

preguntado el 12 de junio de 14 a las 11:06

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.