PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

annotation d'hibernation appropriée pour byte[]

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. Le Basic 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émente Serializable .Comme décrit dans la section 2.8, l'utilisation du Basic 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 le Lob annotation lors du mappage vers une base de données Lob taper. Le Lob l'annotation peut être utilisée conjointement avec l'annotation de base ou avec la ElementCollection annotation lorsque la valeur de la collection d'éléments est de type basic. Un Lob peut être un type binaire ou caractère. Le Lob 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