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?
Respuesta
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();
}
}
Tendré que intentarlo, gracias Brian. –
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.
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
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()
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");
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;
...
}
- 1. cómo aumentar la longitud de salida de la columna sqlplus?
- 2. ¿Cómo se traducen las asignaciones de clase Hibernate a un contexto de aplicación Spring?
- 3. Cómo cambiar las asignaciones de columnas incrustadas de Grails
- 4. Hibernate nombre de la columna emite
- 5. Longitud de datos en la columna ntext?
- 6. spring mvc obtener todas las asignaciones de solicitudes
- 7. obtener una longitud de Fila/columna en C#
- 8. ¿Cómo obtener la longitud de char **?
- 9. ¿Cómo obtener la longitud de IStream? C++
- 10. Cambiar la tabla y las asignaciones de nombre de columna Entity Framework v4.3
- 11. ¿Cuál es la diferencia entre la clase primitiva y contenedora en las asignaciones de columnas JPA (Hibernate)?
- 12. python/numpy: cómo obtener la longitud de la columna 2D array?
- 13. Cómo obtener longitud de cadena
- 14. ¿Cómo puedo obtener que Hibernate comience la columna de la versión en 1 para nuevos objetos?
- 15. SQLAlchemy: longitud máxima de columna
- 16. Obtener el nombre de la columna de la propiedad mapeada con Hibernate
- 17. seguimiento de las asignaciones de memoria C++
- 18. Hibernate: cómo deshabilitar la asignación de una columna
- 19. obtener la longitud de `wchar_t *` en C++
- 20. ¿Cómo obtener una longitud observable de Array?
- 21. ¿Cómo puedo editar las asignaciones de tipos de Chrome MIME?
- 22. ¿El nombre de la tabla o la longitud del nombre de la columna afectan el rendimiento?
- 23. ¿Cómo obtener la sesión de Hibernate dentro de un Interceptor Hibernate?
- 24. Desasignación de las asignaciones del complemento Vim
- 25. ¿Dónde definir las asignaciones de AutoMapper?
- 26. ¿Cómo obtener la longitud de la matriz del puntero C?
- 27. ¿Cómo obtener la longitud y la latitud de cualquier dirección?
- 28. Ember-Data: ¿Cómo funcionan las "asignaciones"
- 29. Encuentra todas las asignaciones a la variable
- 30. Python: excepciones en las asignaciones
Consulte también http://stackoverflow.com/questions/1816780/ para obtener una solución JPA para este problema. –