2009-02-05 93 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; 

    ... 
}