2009-02-05 12 views
7

Aby sprawdzić poprawność otrzymywanych danych, należy się upewnić, że długość nie przekroczy długości kolumny bazy danych. Teraz wszystkie informacje o długości są przechowywane w plikach mapowania Hibernuj, czy istnieje sposób, aby programowo uzyskać dostęp do tych informacji?Uzyskiwanie długości kolumny z odwzorowań w trybie hibernacji?

+0

Zobacz także http://stackoverflow.com/questions/1816780/ dla rozwiązania JPA dla tego problemu. –

Odpowiedz

6

Możesz się do niego dostać, ale nie jest to łatwe. Możesz chcieć zrobić coś jak poniżej podczas uruchamiania i przechowywać statyczny bufor wartości. Jest wiele specjalnych przypadków, którymi można się zająć (dziedziczenie itp.), Ale powinno to działać w przypadku prostych odwzorowań z jedną kolumną. Mogłem pominąć niektóre kontrole instanceof i 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(); 
    } 
    } 
+0

Będę musiał spróbować, dziękuję Brian. –

6

Na podstawie odpowiedzi Briana, właśnie to zrobiłem.

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

Wygląda na to, że działa dobrze. Mam nadzieję, że jest to pomocne dla każdego, kto natknie się na to pytanie.

+0

W Hibernate 5 pobierz PersistentClass w ten sposób (zamiast przez konfigurację): 'StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(). Configure (" hibernate.cfg.xml "). Build(); Metadane metaData = new MetadataSources (standardRegistry) .getMetadataBuilder(). Build(); Lista persistentClasses = new ArrayList (metaData.getEntityBindings()); – olivmir

1

Czasami może wystąpić problem z pobraniem obiektu Configuration (jeśli używasz jakiegoś szkieletu aplikacji i nie tworzysz samodzielnie fabryki sesji przy użyciu konfiguracji).

Jeśli używasz na przykład Spring, możesz użyć LocalSessionFactoryBean (z twojego kontekstu aplikacji), aby uzyskać obiekt Configuration. Następnie uzyskanie długości kolumny tylko kawałka ciasta;)

factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength() 
1

Jednak podczas próby uzyskania dostępu do LocalSessionFactoryBean biorę wyjątku klasy odlewanych

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

wyjątek:

org.hibernate.impl.SessionFactoryImpl cannot be cast to org.springframework.orm.hibernate3.LocalSessionFactoryBean 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean> 

To wydaje się przebiegły ....

EDIT: znalazł odpowiedź. Trzeba użyć znaku & przed ciągiem nazwa fasola

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

see this Spring forum post

3

Mój preferowany wzorzec rozwoju jest oparcie długość kolumny na stałym, które mogą być łatwo odwołuje:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

    ... 
}