Metody dostępu do danych dr inż. Grzegorz Michalski Na podstawie wykładów dra inż. Juliusza Mikody
Obiekt interfejsu Session Jest to podstawowy interfejs komunikacji pomiędzy aplikacją, a API Hibernate Jest on bezpośrednio związany z mechanizmem trwałości Cykl życia sesji jest ograniczony trwaniem transakcji. Głównym zadaniem sesji jest zapis, odczyt i usuwanie mapowanych obiektów z/do bazy danych Jeden obiekt sesji powinien istnieć dla jednego wątku aplikacji
Trwałość, a obiekt sesji Obiekt zdolny do trwałości w bibliotece Hibernate może występować w trzech stanach: Transient przejściowy : nie trwały, nie związany z żadną sesją Utrwalenie: save(), persist() lub saveorupdate() Persistent trwały : związany z sesją i unikalny dla tej sesji Usuniecie obiektu: delete() Detached - odłączony: wcześniej trwały, nie związany z żadną sesją
Zmiany trwałości obiektów Wynikiem save() i persist() jest zapytanie typu INSERT Wynikiem delete() jest zapytanie typ DELETE Wynikiem update() lub merge() powoduje wykonanie zapytania UPDATE. Wynikiem saveorupdate() oraz replicate() jest wykonanie zapytania typu INSERT lub UPDATE.
Obsługa sesji Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.begintransaction(); \\ obs uga obiektów sesyjnych transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printstacktrace(); } f inally { session.close(); }
Odczyt danych Pobranie obiektu Query: Session.createQuery(String HQL) Odczyt pełnej listy obiektów: List Query.list() - odczytuje listę obiektów Iterator Query.iterate() - odczyt pojedynczych obiektów Odczyt pojedynczego obiektu: Object Query.uniqueResult() Odczyt źródła danych: ScrollableResults Query.scroll() ScrollableResults Query.scroll(ScrollMode scrollmode) ScrollMode: FORWARD_ONLY, SCROLL_INSENSITIVE, SCROLL_SENSITIVE
Odczyt danych z bazy transaction = session.begintransaction(); // HQL query string zapytania do obiektów Query query = session.createquery("from User"); // Wykonanie zapytania i odczyt danych for (Object user : query.list()) { System.out.println(user); } transaction.commit();
Filtrowanie danych transaction = session.begintransaction(); // HQL query string - zapytanie Query query = session.createquery( "from User where name = :name"); // wiazanie parametru query.setstring("name", "Tomasz"); // wkonanie zapytania i odczyt danych for (Object user : query.list()) { } System.out.println(user); transaction.commit();
Odczyt danych ResultSet transaction = session.begintransaction(); // HQL query string Query query = session.createquery( "from User where name = :name"); // wiazanie parametrów query.setstring("name", "Tomasz"); // wykonanie zapytania ScrollableResults rs = query.scroll(); // odczyt biektów while (rs.next()) { System.out.println(rs.get(0)); } transaction.commit();
Powiązanie obiektów public class Group { private long id; private String title; private User user; public Group() { } public Group(String title) { super(); this.title = title; } public long getid() { return id; } public String gettitle() { return title; } public void settitle(string title) { this.title = title;} public User getuser() {return user;} public void setuser(user user) {this.user = user;}
Powiązanie obiektów 1 do wielu <hibernate-mapping> <class name="pl.tet.group" table="group_tab"> <id name="id" type="long" access="field"> <column name="id" /> <generator class="identity" /> </id> <property name="title" type="java.lang.string"> <column name="title" /> </property> <many-to-one name="user" class="pl.tet.user" fetch="join"> <column name="user_id" /> </many-to-one> </class> </hibernate-mapping>
Plik metadanych projektu <?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">*****</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">*****</property> <property name="hibernate.dialect">org.hibernate.dialect.mysql5dialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping resource="pl/tet/user.hbm.xml"/> <mapping resource="pl/tet/group.hbm.xml"/> </session-factory> </hibernate-configuration>
Wprowadzanie danych transaction = session.begintransaction(); User user = new User("Tomasz", "Nowak"); session.save(user); Group group = new Group("Osoby"); group.setuser(user); session.save(group); transaction.commit(); Obiekt dowiązywany musi istnieć w bazie danych!
Operacje kaskadowe all wszystkie poniżej create utwórz merge złącz delete usuń save-update zapisz zachowując zmiany evict wyrzuć replicate powtórz lock zablokuj refreh odświerz delete-orphan usuwanie kaskadowe w bazie danych
Wprowadzanie danych <many-to-one name="user" class="pl.tet.user" access="field" fetch="join" cascade="all"> <column name="user" /> </many-to-one> transaction = session.begintransaction(); User user = new User("Tomasz", "Nowak"); //session.save(user); Group group = new Group("Osoby"); group.setuser(user); session.save(group); transaction.commit();
Powiązanie typu Set public class Group { private long id; private String title; private Set<User> users = new HashSet<User>(); public Set<User> getusers() { return users; } public void setusers(set<user> users) { this.users = users; } public void adduser(user user) { this.users.add(user); }
Metadane wiele do wielu <hibernate-mapping> <class name="pl.tet.group" table="group_tab"> <id name="id" type="long" access="field"> <column name="id" /> <generator class="assigned" /> </id> <property name="title" type="java.lang.string"> <column name="title" /> </property> <set name="users" table="link_user_group" inverse="false" lazy="true"> <key column="group_id" foreign-key="fk_user_group" /> <many-to-many class="pl.tet.user" column="user_id" foreign-key="fk_group_user" /> </set> </class> </hibernate-mapping>
Struktura tabel create table GROUP_TAB ( ID bigint not null, TITLE varchar(255), primary key (ID)) create table USER ( USERID bigint not null, NAME varchar(255), SURNAME varchar(255), primary key (USERID)) create table LINK_USER_GROUP ( group_id bigint not null, user_id bigint not null, primary key (group_id, user_id))
Struktura tabel alter table LINK_USER_GROUP add index fk_user_group (group_id), add constraint fk_user_group foreign key (group_id) references GROUP_TAB (ID) alter table LINK_USER_GROUP add index fk_group_user (user_id), add constraint fk_group_user foreign key (user_id) references USER (USERID)