2009-02-05 89 views
7

验证我收到的数据我需要确保长度不会超过数据库列长度。现在所有的长度信息都存储在Hibernate映射文件中,是否有编程方式访问这些信息?从Hibernate映射获取列长度?

+0

另请参阅http://stackoverflow.com/questions/1816780/针对此问题的JPA解决方案。 – 2010-01-06 19:08:54

回答

6

你可以做到但它不容易。您可能想要在启动时执行类似下面的操作,并存储这些值的静态缓存。处理很多特殊情况(继承等),但它应该适用于简单的单列映射。我可能遗漏了一些instanceof和空检查。

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

我将不得不试一试,谢谢Brian。 – 2009-02-06 15:53:09

6

根据Brian的回答,这就是我最终做的。

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

这看起来运行良好。希望这对任何绊倒这个问题的人都有帮助。

+0

使用Hibernate 5像这样获取PersistentClass(而不是通过Configuration):`StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()。configure(“hibernate.cfg.xml”)。build(); Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder()。build(); List persistentClasses = new ArrayList (metaData.getEntityBindings());` – olivmir 2018-01-30 10:14:09

1

有时,获取Configuration对象可能会有问题(如果您正在使用某个应用程序框架并且您没有使用Configuration自己创建会话工厂)。

如果您正在使用Spring,您可以使用LocalSessionFactoryBean(从您的applicationContext)获取Configuration对象。然后柱长的获得是蛋糕的只是一块;)

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

然而,当我尝试访问LocalSessionFactoryBean,我采取了类转换异常

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

例外:

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

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

这似乎很狡猾....

编辑:找到了答案。需要在bean名称字符串前面使用一个符号

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

see this Spring forum post

3

我的优选的改进的模式是基于某个常数列的长度,可以很容易地引用:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

    ... 
}