2009-02-05 10 views
7

Pour valider les données que je reçois, je dois m'assurer que la longueur ne dépassera pas la longueur d'une colonne de base de données. Maintenant, toutes les informations de longueur sont stockées dans les fichiers de mapping Hibernate, y a-t-il de toute façon accès à ces informations par programme?Obtention de la longueur de colonne à partir des mappages Hibernate?

+0

Voir aussi http://stackoverflow.com/questions/1816780/ pour une solution JPA à ce problème. –

Répondre

6

Vous pouvez y arriver mais ce n'est pas facile. Vous pourriez vouloir faire quelque chose comme ci-dessous au démarrage et stocker un cache statique des valeurs. Il y a beaucoup de cas particuliers à traiter (héritage, etc.), mais cela devrait fonctionner pour de simples mappages à une seule colonne. J'aurais peut-être omis certains contrôles d'instance et de null.

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) { 
    PersistentClass persistentClass = (PersistentClass)iter.next(); 
    for (Iterator iter2=persistentClass.getPropertyIterator(); iter2.hasNext();) { 
     Property property = (Property)iter2.next(); 
     String class = persistentClass.getClassName(); 
     String attribute = property.getName(); 
     int length = ((Column)property.getColumnIterator().next()).getLength(); 
    } 
    } 
+0

Je vais devoir essayer, merci Brian. –

6

Basé sur la réponse de Brian, c'est ce que j'ai fini par faire.

private static final Configuration configuration = new Configuration().configure(); 

public static int getColumnLength(String className, String propertyName) { 
    PersistentClass persistentClass = configuration.getClassMapping(className); 
    Property property = persistentClass.getProperty(propertyName); 
    int length = ((Column) property.getColumnIterator().next()).getLength(); 

    return length; 
} 

Cela semble bien fonctionner. J'espère que cela aidera tous ceux qui trébuchent sur cette question.

+0

Avec Hibernate 5, obtenez la classe PersistentClass comme ceci (au lieu de via la configuration): 'StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(). Configure (" hibernate.cfg.xml "). Build(); Métadonnées métaData = new MetadataSources (standardRegistry) .getMetadataBuilder(). Build(); Liste persistClasses = new ArrayList (metaData.getEntityBindings()); ' – olivmir

1

Parfois, il peut être problématique d'obtenir l'objet Configuration (si vous utilisez un framework d'application et que vous ne créez pas de session factory par vous-même en utilisant la Configuration).

Si vous utilisez par exemple Spring, vous pouvez utiliser LocalSessionFactoryBean (à partir de votre applicationContext) pour obtenir l'objet Configuration. Ensuite, l'obtention de la longueur de la colonne est partie juste de gâteau;)

factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength() 
1

Cependant, lorsque je tente d'accéder au LocalSessionFactoryBean, je prends une exception class cast

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("sessionFactory"); 

exception:

org.hibernate.impl.SessionFactoryImpl cannot be cast to org.springframework.orm.hibernate3.LocalSessionFactoryBean 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean> 

Cela semble sournois ....

EDIT: a trouvé la réponse. Vous devez utiliser une esperluette devant la chaîne de nom de haricots

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory"); 

see this Spring forum post

3

Mon modèle de développement préféré est à la base de la longueur de la colonne sur une constante, qui peut être facilement référencé:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

    ... 
} 
Questions connexes