Moduł 08

Transkrypt

Moduł 08
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)

Podobne dokumenty