验证我收到的数据我需要确保长度不会超过数据库列长度。现在所有的长度信息都存储在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