sql >> Base de Datos >  >> RDS >> PostgreSQL

anotación de hibernación adecuada para byte[]

¿Cuál es la forma portátil de anotar una propiedad byte[]?

Depende de lo que quieras. JPA puede persistir un byte[] no anotado . De la especificación JPA 2.0:

11.1.6 Anotación básica

El Basic La anotación es el tipo más simple de asignación a una columna de base de datos. El Basic La anotación se puede aplicar a una propiedad persistente o variable de instancia de cualquiera de los siguientes tipos:Java primitivo, tipos, contenedores de los tipos primitivos, java.lang.String ,java.math.BigInteger ,java.math.BigDecimal ,java.util.Date ,java.util.Calendar , java.sql.Date ,java.sql.Time , java.sql.Timestamp ,byte[] , Byte[] , char[] , Character[] , enumeraciones y cualquier otro tipo que implemente Serializable .Como se describe en la Sección 2.8, el uso del Basic la anotación es opcional para campos persistentes y propiedades de estos tipos. Si no se especifica la anotación básica para dicho campo o propiedad, se aplicarán los valores predeterminados de la anotación básica.

E Hibernate lo asignará "por defecto" a un SQL VARBINARY (o un SQL LONGVARBINARY dependiendo de la Column tamaño?) que PostgreSQL maneja con un bytea .

Pero si quieres el byte[] para almacenarse en un objeto grande, debe usar un @Lob . De la especificación:

11.1.24 Anotación de Lob

Un Lob La anotación especifica que una propiedad o campo persistente debe persistir como un objeto grande en un tipo de objeto grande compatible con la base de datos. Las aplicaciones portátiles deben usar el Lob anotación al mapear a una base de datos Lob tipo. El Lob la anotación se puede usar junto con la anotación básica o con la ElementCollection anotación cuando el valor de la colección del elemento es de tipo básico. Un Lob puede ser un tipo binario o de carácter. El Lob El tipo se deduce del tipo del campo o propiedad persistente y, a excepción de los tipos de cadenas y caracteres, el valor predeterminado es Blob.

E Hibernate lo asignará a un SQL BLOB que maneja PostgreSQL con un oid .

¿Se solucionó esto en alguna versión reciente de hibernación?

Bueno, el problema es que no sé cuál es exactamente el problema. Pero al menos puedo decir que nada ha cambiado desde 3.5.0-Beta-2 (que es donde se introdujo un cambio) en la rama 3.5.x.

Pero mi comprensión de problemas como HHH-4876, HHH-4617 y de PostgreSQL y BLOB (mencionados en el javadoc del PostgreSQLDialect ) es que se supone que debe establecer la siguiente propiedad

hibernate.jdbc.use_streams_for_binary=false

si quieres usar oid es decir, byte[] con @Lob (que es mi entendimiento desde VARBINARY no es lo que quieres con Oracle). ¿Probaste esto?

Como alternativa, HHH-4876 sugiere usar el obsoleto PrimitiveByteArrayBlobType para obtener el comportamiento anterior (anterior a Hibernate 3.5).

Referencias

  • Especificación JPA 2.0
    • Sección 2.8 "Asignación de valores predeterminados para campos o propiedades que no son de relación"
    • Sección 11.1.6 "Anotación básica"
    • Sección 11.1.24 "Anotación de lob"

Recursos

  • http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
  • http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
  • http://relation.to/Bloggers/PostgreSQLAndBLOBs