2008-09-10 7 views
1

J'ai une relation de un à plusieurs entre deux tables. La table plusieurs contient une colonne clob. La colonne clob ressemble à ceci en veille prolongée:Hibernate cultures valeurs clob curieusement

@CollectionOfElements(fetch = EAGER) 
@JoinTable(name = NOTE_JOIN_TABLE, joinColumns = @JoinColumn(name = "note")) 
@Column(name = "substitution") 
@IndexColumn(name = "listIndex", base = 0) 
@Lob 
private List<String> substitutions; 

Donc, fondamentalement, je peut avoir une note avec quelques subsitutions, disons "foo" et "fizzbuzz". Donc, dans ma table principale, je pourrais avoir une note avec l'ID 4 et dans mon NOTE_JOIN_TABLE j'aurais deux lignes, "foo" et "fizzbuzz" qui ont tous deux une relation à la note. Toutefois, lorsque l'un d'entre eux est inséré dans le DB , les valeurs de substitution les plus grandes sont recadrées pour être aussi longues que la plus courte. Donc, dans ce cas, je voudrais "foo" et "fiz" dans la DB au lieu de "foo" et "fizzbuzz".

Avez-vous une idée pourquoi cela se produit? J'ai vérifié et confirmé qu'ils ne sont recadrés nulle part dans notre code, c'est certainement hiberner.

Répondre

0

De nombreux pilotes JDBC, les premières versions d'Oracle en particulier, rencontrent des problèmes lors de l'insertion de LOB. Avez-vous veillé à ce que la requête Hibernate se déclenche, avec les mêmes paramètres liés fonctionne correctement dans votre pilote JDBC?

+0

Il s'est avéré être un problème avec notre pilote JDBC. La solution (jusqu'à ce que nous pouvons un pilote mis à jour) est de désactiver le traitement par lots. – SCdF

0

La colonne LOB/CLOB peut ne pas être assez grande. Hibernate a des tailles de colonnes par défaut pour LOB/CLOB qui sont relativement petites (peuvent dépendre de db). Quoi qu'il en soit, essayer quelque chose comme ceci:

@Lob 
@Column(length=2147483648) 

Ajuster la longueur (en octets) en fonction de vos besoins.

+0

Je ne pense pas que cela puisse être le cas car c'est un recadrage dynamique basé sur la plus grande chaîne de la liste et non un point de coupure statique. – SCdF

+0

Ah, je vois. Problème très étrange. La colonne de jointure de "note" est-elle l'ID de note réelle ou la note réelle? – Todd

+0

La colonne 'Note' est l'identifiant de la note de la table Note. – SCdF