驗證我收到的數據我需要確保長度不會超過數據庫列長度。現在所有的長度信息都存儲在Hibernate映射文件中,是否有編程方式訪問這些信息?從Hibernate映射獲取列長度?
回答
你可以做到但它不容易。您可能想要在啓動時執行類似下面的操作,並存儲這些值的靜態緩存。處理很多特殊情況(繼承等),但它應該適用於簡單的單列映射。我可能遺漏了一些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();
}
}
我將不得不試一試,謝謝Brian。 – 2009-02-06 15:53:09
根據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;
}
這看起來運行良好。希望這對任何絆倒這個問題的人都有幫助。
使用Hibernate 5像這樣獲取PersistentClass(而不是通過Configuration):`StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()。configure(「hibernate.cfg.xml」)。build(); Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder()。build(); List
有時,獲取Configuration對象可能會有問題(如果您正在使用某個應用程序框架並且您沒有使用Configuration自己創建會話工廠)。
如果您正在使用Spring,您可以使用LocalSessionFactoryBean(從您的applicationContext)獲取Configuration對象。然後柱長的獲得是蛋糕的只是一塊;)
factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength()
然而,當我嘗試訪問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");
我的優選的改進的模式是基於某個常數列的長度,可以很容易地引用:
class MyEntity {
public static final int FIELD_LENGTH = 500;
@Column(length = FIELD_LENGTH)
String myField;
...
}
- 1. 從Hibernate映射
- 2. 如何讀取Hibernate映射
- 3. Hibernate映射 - 映射到表
- 4. @ManyToOne hibernate映射序列化
- 5. 的Hibernate映射列表
- 6. Hibernate映射 - 包含映射的映射
- 7. 獲取沒有被映射到Hibernate中的bean類型列表
- 8. 獲取使用Hibernate映射的屬性的列名稱
- 9. Hibernate表映射
- 10. @ManyToOne hibernate映射
- 11. Hibernate HashMap映射
- 12. Hibernate OneToMany映射
- 13. Spring hibernate映射
- 14. 註解Hibernate映射ID /長外鍵可空列
- 15. Hibernate映射映射<String,String>
- 16. hibernate排序映射映射?錯誤:HHH000091
- 17. 的Hibernate映射@OneToOne
- 18. Hibernate父子映射
- 19. Hibernate映射幫助!
- 20. Hibernate映射混亂
- 21. Hibernate集合映射
- 22. 正確Hibernate映射
- 23. 映射在Hibernate中
- 24. Hibernate映射異常
- 25. Hibernate繼承映射
- 26. Hibernate映射繼承
- 27. Hibernate映射錯誤?
- 28. Hibernate外鍵映射?
- 29. Hibernate映射(繼承)
- 30. Hibernate映射:實體映射中的重複列
另請參閱http://stackoverflow.com/questions/1816780/針對此問題的JPA解決方案。 – 2010-01-06 19:08:54