从Hibernate映射中获取列长度?

时间:2009-02-05 17:20:40

标签: database hibernate validation

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

6 个答案:

答案 0 :(得分:7)

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

这似乎运作良好。希望这对偶然发现这个问题的人有所帮助。

答案 1 :(得分:6)

你可以接受它,但这并不容易。您可能希望在启动时执行类似下面的操作并存储值的静态缓存。有许多特殊情况需要处理(继承等),但它应该适用于简单的单列映射。我可能遗漏了一些instanceof和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();
    }
  }

答案 2 :(得分:4)

我首选的开发模式是将列长度基于常量,可以很容易地引用:

class MyEntity {
   public static final int FIELD_LENGTH = 500;

   @Column(length = FIELD_LENGTH)
   String myField;

   ...
}

答案 3 :(得分:1)

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

如果您使用的是Spring,则可以使用LocalSessionFactoryBean(来自applicationContext)来获取Configuration对象。然后获得列长度只是小菜一碟;)

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

答案 4 :(得分: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

答案 5 :(得分:0)

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

任何人都可以在休眠5.4.3中实现相同的功能吗?