Per convalidare i dati che sto ricevendo, devo assicurarmi che la lunghezza non superi la lunghezza di una colonna del database. Ora tutte le informazioni sulla lunghezza sono memorizzate nei file di mapping di Hibernate, è comunque possibile accedere a queste informazioni a livello di programmazione?Ottenere la lunghezza della colonna dai mapping Hibernate?
risposta
Si può arrivare ma non è facile. Si potrebbe voler fare qualcosa come di seguito all'avvio e memorizzare una cache statica dei valori. Ci sono molti casi speciali da trattare (ereditarietà, ecc.), Ma dovrebbe funzionare per semplici mappature a colonna singola. Potrei aver omesso alcuni controlli instanceof e 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();
}
}
Dovrò fare un tentativo, grazie Brian. –
Sulla base della risposta di Brian, questo è quello che ho finito per fare.
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;
}
Sembra funzionare correttamente. Spero che questo sia utile a chiunque si imbatta in questa domanda.
Con Hibernate 5 ottieni PersistentClass in questo modo (invece che tramite la configurazione): 'StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(). Configure (" hibernate.cfg.xml "). Build(); MetaData metadati = new MetadataSources (standardRegistry) .getMetadataBuilder(). Build(); Elenco
A volte può essere problematico ottenere l'oggetto Configuration (se si utilizza un framework di applicazione e non si sta creando la produzione di sessioni da soli utilizzando la configurazione).
Se si utilizza ad esempio Spring, è possibile utilizzare LocalSessionFactoryBean (dal proprio applicationContext) per ottenere l'oggetto Configuration. Poi ottenimento di lunghezza della colonna è solo pezzo di torta;)
factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength()
Tuttavia, quando provo ad accedere al LocalSessionFactoryBean
, prendo un'eccezione calco
LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("sessionFactory");
eccezione:
org.hibernate.impl.SessionFactoryImpl cannot be cast to org.springframework.orm.hibernate3.LocalSessionFactoryBean
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean>
Questo sembra subdolo ....
MODIFICA: ha trovato la risposta. È necessario utilizzare una e commerciale davanti al stringa del nome di fagioli
LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory");
Il mio modello di sviluppo preferito è quello di basare la lunghezza della colonna su una costante, che può essere facilmente riferimento:
class MyEntity {
public static final int FIELD_LENGTH = 500;
@Column(length = FIELD_LENGTH)
String myField;
...
}
Vedere anche http://stackoverflow.com/questions/1816780/ per una soluzione JPA a questo problema. –