středa 22. dubna 2009

Systémové datum pomocí hibernate dialectu

Na našem projektu jsme potřebovali mechanismus, který by zjišťoval systémové datum. Pro každou db jsme implementovali třídu, kde byl natvrdo napsán JDBC select. Kupříkladu, v Oraclu "select sysdate from dual", pro MSSQL byla obdoba "select getdate()". Nakonec se ukázalo daleko příjemnějším řešením hibernate dialect.

Hibernatu musíte dát vědět, s jakou db má tu čest a to tak, že mu docpete konkrétní dialect. Hlavní předek je abstraktní třída
org.hibernate.dialect.Dialect. Obsahuje metodu getCurrentTimestampSelectString(), kterou implementují konkrétní dialecty. V této metodě se nachází náš hledaný JDBC select.

Teď k samotnému řešení.


public Calendar getSysDate() {
Calendar sysDate = Calendar.getInstance();
if (sessionFactory instanceof SessionFactoryImplementor) {
Session session = SessionFactoryUtils.getNewSession(sessionFactory);
Dialect dialect = ((SessionFactoryImplementor) sessionFactory).getDialect();
String queryString;
try {
queryString = dialect.getCurrentTimestampSelectString();
} catch (UnsupportedOperationException un) {
return sysDate;
}
Query query = session.createSQLQuery(queryString);
Object result = query.uniqueResult();
if (result != null && result instanceof Date) {
sysDate.setTime((Date) result);
}
}
return sysDate;
}

V případě, že pro daný dialect není přepsána metoda
getCurrentTimestampSelectString(), vyhodí se vyjímka UnsupportedOperationException a metoda getSysDate() vrací Calendar.getInstance(). Určitě by jste to tak neměli nechat a měli by jste si přepsat váš potřebný dialect a implementovat výše uvedenou metodu :).

Žádné komentáře:

Okomentovat