Получение длины столбца из отображений Hibernate? - PullRequest
8 голосов
/ 05 февраля 2009

Для проверки данных, которые я получаю, мне нужно убедиться, что длина не превысит длину столбца базы данных. Теперь вся информация о длине хранится в файлах отображения Hibernate, есть ли какой-либо доступ к этой информации программно?

Ответы [ 5 ]

7 голосов
/ 18 февраля 2009

Основываясь на ответе Брайана, это то, что я в итоге сделал.

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

Кажется, это работает хорошо. Надеюсь, что это полезно для всех, кто сталкивается с этим вопросом.

6 голосов
/ 06 февраля 2009

Вы можете добраться до этого, но это не легко. Возможно, вы захотите сделать что-то вроде ниже при запуске и сохранить статический кеш значений. Существует множество особых случаев (наследование и т. Д.), Но они должны работать для простых одноколоночных отображений. Возможно, я пропустил некоторые проверки 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();
    }
  }
4 голосов
/ 28 января 2013

Мой предпочтительный шаблон разработки должен основывать длину столбца на константе, на которую легко ссылаться:

class MyEntity {
   public static final int FIELD_LENGTH = 500;

   @Column(length = FIELD_LENGTH)
   String myField;

   ...
}
1 голос
/ 12 ноября 2009

Однако, когда я пытаюсь получить доступ к 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>

Это кажется коварным ....

РЕДАКТИРОВАТЬ: нашел ответ. Вам нужно использовать амперсанд перед строкой имени бина

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory");

см. Это сообщение на весеннем форуме

1 голос
/ 20 октября 2009

Иногда может быть проблемой получить объект конфигурации (если вы используете какую-то платформу приложений и не создаете фабрику сеансов самостоятельно, используя конфигурацию).

Если вы используете, например, Spring, вы можете использовать LocalSessionFactoryBean (из вашего applicationContext) для получения объекта конфигурации. Тогда получение длины столбца - это просто кусок пирога;)

factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...