2009-02-05 9 views
7

Para validar los datos que estoy recibiendo, necesito asegurarme de que la longitud no exceda la longitud de la columna de la base de datos. Ahora toda la información de longitud se almacena en los archivos de mapeo de Hibernate, ¿hay alguna forma de acceder a esta información mediante programación?¿Cómo obtener la longitud de columna de las asignaciones de Hibernate?

+0

Consulte también http://stackoverflow.com/questions/1816780/ para obtener una solución JPA para este problema. –

Respuesta

6

Puede acceder a él, pero no es fácil. Es posible que desee hacer algo como a continuación al inicio y almacenar un caché estático de los valores. Hay muchos casos especiales para tratar (herencia, etc.), pero debería funcionar para asignaciones sencillas de una sola columna. Podría haber omitido algunos controles de instancia y nulos.

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

Tendré que intentarlo, gracias Brian. –

6

Basado en la respuesta de Brian, esto es lo que terminé haciendo.

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; 
} 

Parece que funciona bien. Espero que esto sea útil para cualquiera que tropiece con esta pregunta.

+0

Con Hibernate 5, obtenga la clase PersistentClass así (en lugar de a través de la configuración): 'StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(). Configure (" hibernate.cfg.xml "). Build(); Metadata metaData = new MetadataSources (standardRegistry) .getMetadataBuilder(). Build(); Lista persistentClasses = new ArrayList (metaData.getEntityBindings()); ' – olivmir

1

A veces puede ser un problema obtener el objeto de configuración (si está utilizando algún marco de aplicación y no está creando una fábrica de sesión por sí mismo usando la configuración).

Si está utilizando, por ejemplo, Spring, puede usar LocalSessionFactoryBean (desde su applicationContext) para obtener el objeto Configuration. Entonces obtención de longitud de columna es solo trozo de tarta;)

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

Sin embargo, cuando intento de acceder a la LocalSessionFactoryBean, tomo una excepción fundido clase

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

excepción:

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

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

Esto parece desviado ....

EDITAR: encontró la respuesta. Es necesario utilizar un símbolo de unión frente a la cadena de nombre de frijol

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

see this Spring forum post

3

Mi patrón de desarrollo preferido es basar la longitud de la columna en una constante, que puede ser referenciado fácilmente:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

    ... 
} 
Cuestiones relacionadas