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?
Odpowiedz
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();
}
}
Będę musiał spróbować, dziękuję Brian. –
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.
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
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()
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");
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;
...
}
Zobacz także http://stackoverflow.com/questions/1816780/ dla rozwiązania JPA dla tego problemu. –