Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 从Hibernate映射获取列长度?_Database_Hibernate_Validation - Fatal编程技术网

Database 从Hibernate映射获取列长度?

Database 从Hibernate映射获取列长度?,database,hibernate,validation,Database,Hibernate,Validation,为了验证接收到的数据,我需要确保长度不会超过数据库列的长度。现在,所有长度信息都存储在Hibernate映射文件中,是否还有其他方法可以通过编程方式访问这些信息?您可以访问这些信息,但这并不容易。您可能希望在启动时执行以下操作,并存储一个静态值缓存。有很多特殊情况需要处理(继承等),但它应该适用于简单的单列映射。我可能遗漏了一些instanceof和null检查 for (Iterator iter=configuration.getClassMappings(); iter.hasNext()

为了验证接收到的数据,我需要确保长度不会超过数据库列的长度。现在,所有长度信息都存储在Hibernate映射文件中,是否还有其他方法可以通过编程方式访问这些信息?

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

根据布赖恩的回答,这就是我最后要做的

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

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

有时候获取配置对象可能会有问题(如果您使用的是某个应用程序框架,而不是自己使用配置创建会话工厂)

如果您使用的是例如Spring,那么可以使用LocalSessionFactoryBean(从您的applicationContext)来获取配置对象。那么,获得列长度只是小菜一碟;)


但是,当我尝试访问
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>

我首选的开发模式是将列长度建立在一个常数的基础上,该常数可以很容易地引用:

class MyEntity {
   public static final int FIELD_LENGTH = 500;

   @Column(length = FIELD_LENGTH)
   String myField;

   ...
}

另请参阅以获取此问题的JPA解决方案。使用Hibernate 5,可以像这样获取PersistentClass(而不是通过配置):
StandardServiceRegistry standardRegistry=new StandardServiceRegistryBuilder().configure(“Hibernate.cfg.xml”).build();元数据=新的元数据源(standardRegistry).getMetadataBuilder().build();List persistentClasses=newarraylist(metaData.getEntityBindings())
LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory");
class MyEntity {
   public static final int FIELD_LENGTH = 500;

   @Column(length = FIELD_LENGTH)
   String myField;

   ...
}