La cartographie de type varchar et nvarchar en veille prolongée
Si il y a 2 colonnes dans la base de données, par exemple.
code varchar(3)
name nvarchar(50)
Comment dire hibernate pour passer varchar pour la recherche par code?
Dans hibernate mappages de chaîne est mappé à nvarchar et il produit des requêtes comme:
Select code, name From table where code=N'AAA' (instead of code='AAA')
C'est très mauvais, car il provoque des index scan au lieu de l'opération de recherche d'index (l'analyse de tous les nœuds d'index au lieu d'aller directement à la demande)
Que le code est utilisé dans des millions de lignes ainsi que dans plusieurs index et les clés étrangères, en changeant de type varchar nvarchar entraîner une dégradation des performances (plus d'opérations d'e /s de type nvarchar utilise deux fois plus d'espace que varchar).
Est-il possible de dire d'hibernation pour faire de la cartographie en fonction de type de base de données, pas de type Java?
Grâce
- Poser cette question sur la groups.google.com/group/nhusers
- vous souhaitez hiberntae faire de votre champ dans la base de données par type nvarchar? ou quelque chose d'autre?
- Je veux hibernate pour passer varchar paramètre de type varchar et nvarchar paramètre de type nvarchar. par exemple. Insert Into table(varcharCol, nvarcharCol) Values ('aaa', N'aaa')
- avez-vous résolu le problème? j'ai le même
Vous devez vous connecter pour publier un commentaire.
Probablement vous avez déjà résolu ce problème, mais j'ai eu un problème similaire.
Je suis en utilisant jTDS pilote JDBC et j'ai résolu de l'analyse d'index problème en ajoutant:
à la fin de la jTDS chaîne de connexion.
Il serait probablement n'avaient pas résolu votre problème, car en faisant cela, jTDS utilisera uniquement de type VARCHAR (pas de type NVARCHAR plus).
Aussi, j'ai dû désactiver le SQL préparée, parce que Hibernate utilise 'comme' au lieu de '=' lors de la génération des requêtes et par l'utilisation de 'like', combiné avec une variable (SELECT ... OÙ la colonne COMME @var) provoque un index scan (MSSQL 2000).
Je suppose que vous parlez de NHibernate plutôt que Hibernate parce que ce dernier n'utilise pas de type nvarchar dans son défaut SqlServer dialecte.
La façon de résoudre votre problème consiste à spécifier le type de colonne comme "AnsiString" dans votre cartographie:
Prendre un coup d'oeil à ce post pour plus de détails.
Ajouter le code ci-dessus dans le hibernate reveng fichier.
En veille prolongée.définir les propriétés de la propriété hibernate.connexion.defaultNChar=false.
Vous pouvez masquer vos tables derrière points de vue ou de l'utilisation nstring type. Ce type est disponible en mise en veille prolongée-core 4.x. Dans hibernate-core 3.6.10.Final vous aurez besoin de définir le type personnalisé nstring - voir le commentaire dans l'url:
Obtention d'Hibernate et de SQL Server pour jouer gentil avec VARCHAR et NVARCHAR.