¿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