Suivant de près Cet exemple , je télécharge un petit fichier et essaye de stocker dans la colonne PostgreSQL ByTea .
Voici une erreur (les deux premières sorties sont des instructions de journalisation des attributs de haricot avant que l'insert ne soit tenté: p>
Sage 1 - action.registration.lettertemplateHome - Type de contenu: Texte / XML P>
Sage 1 - action.registration.lettertemplateHome - letterTemplatetext: [B @ 48C7AAF P>
Sage 1 - action.registration.lettertemplateHome - Contenu en tant que chaîne: Version XML = "1,0" coding = "utf-8" autonome = "Oui" .... et etc p>.
sage 1 - org.hibernate.util.jdbceceptionReporter - entrée lot 0 Insérer dans lettre_template (content_type, fichier_template, fichiers, lettre_template_text, lettre_template_text, lettre_template_id) valeurs ("text / xml", '0 ',' Yu ',' 37078 ',' 202 ') a été abandonné. Appelez GetNextException pour voir la cause. P>
sage 1 - org.hibernate.util.jdbceceptionReporter - Erreur: colonne "lettre_template_text" est de type bytea mais expression est de type Bigint Astuce: Vous devrez réécrire ou jeter l'expression. Position: 162 P> blockQuote>
Voici comment le champ est défini dans le haricon: p>
xxx pré> p>
5 Réponses :
Cela ne répond pas vraiment à votre question, mais je pensais partager de toute façon ... p>
Il existe deux façons de stocker des fichiers à l'aide d'une base de données, réellement: stocker le contenu réel du fichier (comme vous le faisez) et stocke uniquement le chemin de fichier (et le sauvegarde dans le système de fichiers actuel). < / p>
J'ai travaillé avec les deux méthodes et j'ai préféré ce dernier pour deux raisons: je peux déplacer mes fichiers autour d'autres disques durs, partitions et même y accéder via une part et tout ce que j'ai besoin de faire est de modifier les chemins de fichiers dans la base de données. En outre, il fabrique des décharges de base de données (alias de sauvegardes) beaucoup plus petites et plus rapides. P>
Merci pour votre commentaire. Notre environnement est enfermé dans la mesure où stocker des fichiers téléchargés dans le système de fichiers. Je devrais avoir une très bonne raison pour une variance. De plus, nous avons des équilibreurs de charge et ils gèrent bien la base de données. Je ne sais pas comment ils jongleraient des fichiers système de fichiers. La quantité de données en question est très petite et n'aura pas d'impact sur la performance. Et, je pense que la création de ce lien entre la DB et le système de fichiers se révéleraient être très fragiles.
Je soupçonne que Hibernate tente d'utiliser la méthode "gros objet" avec PostgreSQL, qui consiste à stocker une "poignée" de l'OID dans le fichier de la table. Quelques exemples de lecture: http: // VIRGO47.WordPress.com/2008/06/13/JPA-POSTGRESQL-AND-BYTEA-VS-OID-TYPE/ P>
Si vous voulez vous tenir à l'aide d'une colonne BYTEA (et cela est considérablement plus simple de fonctionner avec du côté SQL), utilisez BinaireType pour mapper la colonne. Voir: Annotation hibernate appropriée pour les octets [] P>
Merci. Votre premier lien décrit définitivement le problème. Le problème, cependant, est parti lorsque je suis allé à une autre version de PostgreSQL (et d'un conducteur différent), je posterai un tableau de quels pilotes / quelles annotations fonctionnent ensemble.
L'erreur similaire peut apparaître si vous préférez
est BYTEA mais l'expression est de type chaîne code>). Il vous suffit de spécifier toutes les colonnes du tableau explicitement avec les balises code> colonne CODE> et fournissez leur type de données. P>
Pour moi, il fonctionne avec type bytea code> dans la base de données Postgres.
change @Lob annotation with @Table instead of this ; **@Lob** @Column(name = "letter_template_text") @Basic(fetch = FetchType.LAZY) private byte[] icon; write ; **@Type(type="org.hibernate.type.BinaryType")** @Column(name = "letter_template_text") @Basic(fetch = FetchType.LAZY) private byte[] icon;