Moduł 07
Transkrypt
Moduł 07
Metody dostępu do danych dr inż. Grzegorz Michalski na podstawie materiałów od dr inż. Juliusza Mikody Architektura Hibernate Własności hibernate Własności hibernate określamy w pliku konfiguracyjnym hibernate.properities w katalogu głównym aplikacji. Można zdefiniować wartość w pliku konfiguracyjnym hibernate.cfg.xml. Wartości te nadpisują wartości wprowadzone w pliku hibernate.properities. Możliwe jest także określenie właściwości bezpośrednio w programie. Własności można zmienić metodą klasy Configuration : void setProperty(String key, Object value) Hibernate – etapy tworzenia aplikacji Określenie obiektów zdolnych do trwałych (określenie własności do utrwalenia) Tworzenie plików XML odwzorowań obiektów w bazie Tworzenie schematu bazy danych (modyfikacja lub użycie już istniejącej bazy) Dołączenie bibliotek Hibernate do projektu Utworzenie pliku konfiguracyjnego Utworzenie obiektu Configuration / SessionFactory Najważniejsze własności hibernate.connection.driver_class – klasa sterowników jdbc hibernate.connection.password – hasło do bazy danych hibernate.connection.url – adres połączenia z bazą danych hibernate.connection.username – użytkownik bazy danych hibernate.connection.pool_size – liczba jednoczesnych połączeń z bazą danych hibernate.dialect – dialekt używany w bazie danych Najważniejsze własności hibernate.hbm2ddl.auto – automatyczne uaktualnienie schematu bazy danych. Może przyjmować wartości: create – tworzenie schematu bazy danych create-drop – utworzenie schematu bazy danych a następnie jego usunięcie po zakończeniu działania aplikacji update – uaktualnienie schematu bazy danych validate – sprawdzenie poprawności schematu bazy danych Konfiguracja hibernate.properities Jednym ze sposobów wprowadzenia konfiguracji jest utworzenie pliku hibernate.properities. Plik ten powinien zawierać pary: parametr = wartość: hibernate.connection.driver_class = com.mysql.jdbc.Driver hibernate.connection.url = jdbc:mysql://localhost:3306/test hibernate.connection.username = root hibernate.connection.password = ***** hibernate.dialect = org.hibernate.dialect.MySQL5Dialect hbm2ddl.auto = update show_sql = true Konfiguracja hibernate.cfg.xml Plik hibernate.cfg.xml może zawierać pełną konfiguracje połączenia hibernate lub nadpisywać dane już istniejące: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">max</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration> Dialekt SQL W celu uogólnienia działania metod komunikacji z bazą danych wszystkie różnice pomiędzy systemami bazodanowymi zostały zaimplementowane w odpowiednich klasach dialektów SQL. Klasy te istnieją w pakiecie org.hibernate.dialect. Każdy z silników baz danych posiada własny dialekt który powinien być załadowany do konfiguracji: MySQL: MySQL5Dialect, MySQLDialect (poniżej wersji 5.0) Oracle: Oracle10gDialect, Oracle9i, Oracle PostgreSQLDialect, ProgressDialect, SQLServer2008Dialect, SQLServerDialect Załadowanie konfiguracji Do załadowania konfiguracji do hibernate służy metoda configure() klasy Configuration. Możliwych jest pięć wariantów wywołania tej metody: Configuration configure() - załadowanie domyślnego pliku XML: hibernate.cfg.xml Configuration configure(Document document) – pobranie danych z dokumentu xmla Configuration configure(File configFile) załadowanie informacji z pliku Configuration configure(String resource) – j/w Configuration configure(URL url) - adres sieciowy Mapowanie obiektów Aby obiekt klasy mógł być przekazany jako obiekt trwały dla klasy musi powstać odpowiedni plik odwzorowania w bazie danych. Nazwa pliku powinna odpowiadać nazwie klasy z dodanym rozszerzeniem Klasa.hbm.xml Plik powinien znajdować się w tym samym katalogu co klasa. Informacja o odwzorowaniu powinna być przekazana do obiektu Configuration za pomocą metod zanim zostanie utworzona fabryka sesji. Mapowanie obiektów public class User { private long userId; private String name; private String surname; public User() { // Konstruktor domyślny wymagany przez Hibernate } public User(String name, String surname) { this.name = name; this.surname = surname; } // metody get i set } Mapowanie obiektów <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="pl.test.User" table="USER"> <id name="userId" type="long"> <column name="ID" /> <generator class="assigned" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="surname" type="java.lang.String" column="SURNAME" /> </class> </hibernate-mapping> Obiekt class Służy do opisu jednego wiersza (krotki) tabeli danych odpowiadającemu jednemu obiektowi danej klasy. Może posiadać kilka atrybutów: name – nazwa klasy javy, która przyjmuje wartości pobrane z bazy danych. package – pakiet, w którym znajduje się klasa. Nazwa klasy może być powiązana z pakietem. table – nazwa tabeli do której dany obiekt się odnosi. Obiekt id Mapowanie klucza podstawowego tabeli danych. Obiekt ten musi istnieć w mapowaniu klasy. name – nazwa pola klucza. Wartość opcjonalna jeśli obiekt nie implementuje wartości klucza głównego tabeli danych. type – typ wartości identyfikowany przez hibernate column – nazwa kolumny w bazie danych generator – obiekt służący do implementacji generatora przydzielającego unikalny identyfikator (increment, identity, sequence, assigned – default, select, foreign) Obiekt property Obiekt wiążący kolumnę wiersza tabeli z atrybutem klasy. Atrybuty: name – nazwa atrybuty klasy column – nazwa kolumny w bazie danych type – nazwa typu zapisywanego w bazie: Bazodanowe: integer, string, character, date, timestamp, float, binary, serializable, object, blob ... Klasy javy: int, float, char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob ... Obiekt property unique – wartość unikatowa dla bazy danych not-null – wymaganie istnienia wartości generated – informuje o generowaniu wartości przez bazę danych formula – pole generowane przez bazę danych na podstawie zapytania sql, np: formula="( SELECT SUM (quantity*price) FROM Tab)" Obiekt tworzenia sesji import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { sessionFactory = new Configuration(). Configure().builsSesionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } Utworzenie obiektu trwałego Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); User user = new User("Tomasz", "Nowak"); session.save(user); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); }