验证我收到的数据我需要确保长度不会超过数据库列长度。现在所有的长度信息都存储在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. Hibernate映射 - 包含映射的映射
- 5. 获取使用Hibernate映射的属性的列名称
- 6. @ManyToOne hibernate映射
- 7. Hibernate HashMap映射
- 8. 注解Hibernate映射ID /长外键可空列
- 9. Hibernate父子映射
- 10. Hibernate映射混乱
- 11. Hibernate映射继承
- 12. Hibernate映射错误?
- 13. 的Hibernate映射@OneToOne
- 14. Hibernate映射帮助!
- 15. Hibernate外键映射?
- 16. Hibernate映射(继承)
- 17. Hibernate映射:实体映射中的重复列
- 18. 对映射值长度的JPA映射<String,String>限制?
- 19. 通过映射表获取映射列名(Sql)
- 20. hibernate用未映射的列做什么?
- 21. Jpa Hibernate映射键多列关系
- 22. Hibernate连接映射多对一,多列
- 23. 使用Hibernate映射布尔型[] PostgreSql列
- 24. Discriminator列映射为实体Hibernate
- 25. hibernate映射列表<CustomClass> - ClassCastException
- 26. 在JPA Hibernate映射队列集合
- 27. 修改列表映射获取ConcurrentModificationException
- 28. ImageCanvas中像素长度映射的坐标长度
- 29. 获取长度
- 30. 从POJOS生成Hibernate映射文件(* .hbm.xml)?
另请参阅http://stackoverflow.com/questions/1816780/针对此问题的JPA解决方案。 – 2010-01-06 19:08:54