package cz.cvut.fel.restauracefel.hibernate; import java.io.Serializable; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; /** * Trida zajistujici komunikace domenovych trid s databazi. Konkretni domenove * tridy dedi od teto tridy. * * @author Jarda */ public class DBEntity implements Serializable { protected static Session session = HibernateSessionFactory.getSession(); /** * Ulozi objekt do databaze. * * @param object objekt ktery se ma ulozit do databaze */ protected void create(Object object) { Transaction tx = null; try { tx = session.beginTransaction(); session.save(object); tx.commit(); } catch (Exception ex) { ex.printStackTrace(); if (tx != null && tx.isActive()) { tx.rollback(); } } } /** * Vymaze objekt z databaze. * * @param object objekt ktery ma byt smazan z databaze */ protected void delete(Object object) { Transaction tx = null; try { tx = session.beginTransaction(); session.delete(object); tx.commit(); } catch (Exception ex) { ex.printStackTrace(); if (tx != null && tx.isActive()) { tx.rollback(); } } } /** * Aktualizuje objekt v databazi. * * @param object object ktery chceme aktualizovat */ protected void update(Object object) { Transaction tx = null; try { tx = session.beginTransaction(); session.update(object); tx.commit(); } catch (Exception ex) { ex.printStackTrace(); if (tx != null && tx.isActive()) { tx.rollback(); } } } /** * Vykona dotaz, ktery dostane jako parametr a jako vysledek vrati seznam objektu * nebo null, pokud se neco pokazi. * * @param queryText samotny text dotazu * @param parameterNames nazvy parametru * @param parameterTypes datove typy parametru * @param parameterValues hodnoty parametru */ protected static List executeQuery(String queryText, String[] parameterNames, String[] parameterTypes, Object[] parameterValues) { if (parameterNames.length != parameterValues.length || parameterTypes.length != parameterNames.length) { return null; } Transaction tx = null; try { tx = session.beginTransaction(); Query query = session.createQuery(queryText); for (int i = 0; i < parameterNames.length; i++) { String parameterType = parameterTypes[i].toLowerCase(); if (parameterType.equals("string")) { query.setString(parameterNames[i], (String) parameterValues[i]); } else if (parameterType.equals("int") || parameterType.equals("integer")) { query.setInteger(parameterNames[i], (Integer) parameterValues[i]); } else if (parameterType.equals("date")) { query.setDate(parameterNames[i], (Date) parameterValues[i]); } else if (parameterType.equals("double")) { query.setDouble(parameterNames[i], (Double) parameterValues[i]); } } List result = query.list(); tx.commit(); return result; } catch (Exception e) { e.printStackTrace(); if (tx != null && tx.isActive()) { tx.rollback(); } return null; } } /** * Metoda najde datovy zaznam z databaze odpovidajici zadanym parametrum. * * @param className nazev tridy, pro kterou hledame zaznam * @param column nazev promenne, reprezentujici sloupec v databazi * @param id hodnota, podle ktere se bude vyhledavat * * @return odpovidajici databazovy zaznam */ public static DBEntity findById(String className, String column, Integer id) { String[] paramNames = {"id"}; String[] paramTypes = {"Integer"}; Object[] paramValues = {id}; //String idParamName = className.substring(0, 1).toLowerCase() + className.substring(1) + "ID"; String idParamName = column; // POZOR, tady parametrem neni nazev tabulky a sloupecku, ale nazev tridy a jejich atributu List res = executeQuery("from " + className + " x where x." + idParamName + " = :id", paramNames, paramTypes, paramValues); if (res == null || res.isEmpty()) { return null; } return (DBEntity) res.get(0); } /** * Metoda navraci odpovidajici instanci potomka tridy DBEntity. Vraci pouze * nesmazane zaznamy. * * @param className nazev tridy, pro kterou hledame zaznam * @param columnId oznacuje nazev sloupce, kde je uvedeno ID * @param id id hodnota, podle ktere se bude vyhledavat * @param columnDel nazev sloupce, kde je uvedena hodnota, podle ktere se * rozhoduje zda je dany zaznam smazan ci nikoliv * @param del ID hodnota, ktera oznacuje nesmazany zaznam * @return odpovidajici instance potomka tridy DBEntity */ public static DBEntity findByIdNotDeleted(String className, String columnId, Integer id, String columnDel, Integer del) { String[] paramNames = {"id", "del"}; String[] paramTypes = {"Integer", "Integer"}; Object[] paramValues = {id, del}; // POZOR, tady parametrem neni nazev tabulky a sloupecku, ale nazev tridy a jejich atributu String query = "from " + className + " x where x." + columnId + " = :id and x." + columnDel + " = :del"; List res = executeQuery(query, paramNames, paramTypes, paramValues); if (res == null || res.isEmpty()) { return null; } return (DBEntity) res.get(0); } /** * Vrati vsechny zaznamy pro danou tridu. * * @param className nazev tridy * @return List odpovodajicich instanci dane tridy. */ public static List findAll(String className) { List res = executeQuery("from " + className + " x", new String[0], new String[0], new Object[0]); if (res == null || res.isEmpty()) { return null; } return res; } /** * Metoda navraci seznam vsech databazovych zaznamu tridy "className", ktere * nejsou smazany (flag "isDeleted" je nastaven na 0). * * @param className nazev tridy * @param columnDeleted nazev sloupce, kde je uvedena hodnota, podle ktere * se rozhoduje zda je dany zaznam smazan ci nikoliv * @param del ID hodnota, ktera oznacuje nesmazany zaznam * @return list odpovodajicich instanci dane tridy */ public static List findAllNotDeleted(String className, String columnDeleted, Integer del) { String[] paramNames = {"del"}; String[] paramTypes = {"Integer"}; Object[] paramValues = {del}; String query = "from " + className + " x where x." + columnDeleted + " = :del"; List res = executeQuery(query, paramNames, paramTypes, paramValues); if (res == null || res.isEmpty()) { return null; } return res; } /** * Metoda najde zaznam, jenz odpovida specifikovanym parametrum. Vraci pouze * nesmazane zaznamy. * * @param className nazev tridy, jejiz zaznam hledame * @param columnName nazev promenne (sloupce v databazi) pro ktery hledame odpovidajici hodnotu * @param name hodnota, podle ktere se vyhledava odpovidajici zaznam * @param columnDel nazev sloupce, kde je uvedena hodnota, podle ktere se * rozhoduje zda je dany zaznam smazan ci nikoliv * @param del ID hodnota, ktera oznacuje nesmazany zaznam * @return instance daneho potomku tridy DBEntity */ public static DBEntity findByStringNameNotDeleted(String className, String columnName, String name, String columnDel, Integer del) { String[] paramNames = {"name", "del"}; String[] paramTypes = {"String", "Integer"}; Object[] paramValues = {name, del}; String query = "from " + className + " x where x." + columnName + " = :name and x." + columnDel + " = :del"; List res = executeQuery(query, paramNames, paramTypes, paramValues); if (res == null || res.isEmpty()) { return null; } return (DBEntity) res.get(0); } /** * Najde zaznam, jenz odpovida specifikovanym parametrum. * * @param className nazev tridy, jejiz zaznam hledame * @param column nazev promenne (sloupce v databazi) pro ktery hledame odpovidajici hodnotu * @param name hodnota, podle ktere se vyhledava odpovidajici zaznam * @return */ public static DBEntity findByStringName(String className, String column, String name) { String[] paramNames = {"name"}; String[] paramTypes = {"String"}; Object[] paramValues = {name}; String idParamName = column; List res = executeQuery("from " + className + " x where x." + idParamName + " = :name", paramNames, paramTypes, paramValues); if (res == null || res.isEmpty()) { return null; } return (DBEntity) res.get(0); } }