Quelle est la manière portable d'annoter une propriété byte[] ?
Cela dépend de ce que vous voulez. JPA peut conserver un byte[]
non annoté . À partir de la spécification JPA 2.0 :
11.1.6 Annotation de base
Le
Basic
L'annotation est le type le plus simple de mappage à une colonne de base de données. LeBasic
l'annotation peut être appliquée à une propriété persistante ou à une variable d'instance de l'un des types suivants :Java primitif, types, enveloppes des types primitifs,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[]
, enums et tout autre type qui implémenteSerializable
.Comme décrit dans la section 2.8, l'utilisation duBasic
l'annotation est facultative pour les champs persistants et les propriétés de ces types. Si l'annotation de base n'est pas spécifiée pour un tel champ ou une telle propriété, les valeurs par défaut de l'annotation de base s'appliqueront.
Et Hibernate le mappera "par défaut" à un SQL VARBINARY
(ou un SQL LONGVARBINARY
en fonction de la Column
size ?) que PostgreSQL gère avec un bytea
.
Mais si vous voulez le byte[]
pour être stocké dans un Large Object, vous devez utiliser un @Lob
. De la spécification :
11.1.24 Annotation des lobes
Un
Lob
une annotation spécifie qu'une propriété ou un champ persistant doit être persistant en tant qu'objet volumineux vers un type d'objet volumineux pris en charge par une base de données. Les applications portables doivent utiliser leLob
annotation lors du mappage vers une base de donnéesLob
taper. LeLob
l'annotation peut être utilisée conjointement avec l'annotation de base ou avec laElementCollection
annotation lorsque la valeur de la collection d'éléments est de type basic. UnLob
peut être un type binaire ou caractère. LeLob
type est déduit du type du champ ou de la propriété persistant et, à l'exception des types de chaîne et de caractère, est défini par défaut sur Blob.
Et Hibernate le mappera sur un SQL BLOB
que PostgreSQL gère avec un oid
.
Est-ce corrigé dans une version récente d'hibernate ?
Eh bien, le problème est que je ne sais pas exactement quel est le problème. Mais je peux au moins dire que rien n'a changé depuis la 3.5.0-Beta-2 (où un changement a été introduit) dans la branche 3.5.x.
Mais ma compréhension des problèmes comme HHH-4876, HHH-4617 et de PostgreSQL et BLOBs (mentionné dans le javadoc du PostgreSQLDialect
) est que vous êtes censé définir la propriété suivante
hibernate.jdbc.use_streams_for_binary=false
si vous voulez utiliser oid
c'est-à-dire byte[]
avec @Lob
(ce qui est ma compréhension depuis VARBINARY
n'est pas ce que vous voulez avec Oracle). Avez-vous essayé ?
Comme alternative, HHH-4876 suggère d'utiliser le PrimitiveByteArrayBlobType
obsolète pour obtenir l'ancien comportement (avant Hibernate 3.5).
Références
- Spécification JPA 2.0
- Section 2.8 "Mappage des valeurs par défaut pour les champs ou propriétés sans relation"
- Section 11.1.6 "Annotation de base"
- Section 11.1.24 "Annotation de lobe"
Ressources
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs