Przykładowa aplikacja
Rafał Kasprzyk
Rafał Kasprzyk
Diagram klas wybranej
dziedziny
Implementa
cja asocjacji
jednokierun
kowej
Implementa
cja asocjacji
dwukierunk
owej
Rafał Kasprzyk
Asocjacja 1-N
public class Country {
private Long id;
private String name;
private Double area;
private Set militaryUnits;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
…
// pozostałe metody setXXX i getXXX
}
<hibernate-mapping
package="pl.isolution.hibernate.army" >
<class name="Country" table="Country">
…
<set name="militaryUnits" inverse="true"
cascade="all">
<key column="COUNTRY_FK"/>
<one-to-many class="MilitaryUnit"/>
</set>
</class>
</hibernate-mapping>
Wszystkie operacje
(np. zapis, usuwanie,
…) propagują się na
obiekty podrzędne
tzw.
przechodnia
przechodnia
trwałość
trwałość
Drugi koniec
asocjacji
spowoduje
wygenerowanie
polecenia DML
(asocjacja
dwukierunkowa)
Country.ja
va
Country.hbm
.xml
Rafał Kasprzyk
Asocjacja 1-N
public class MilitaryUnit {
private Long id;
private String name;
private Double potential;
private Integer soldiersNumber;
private Integer wounderSoldiersNumber;
private Integer killedSoldiersNumber;
private Byte moraleLevel;
private String description;
private MilitaryUnit superiorUnit;
private Country country;
private Set enquipments;
private Set resoutces;
…
// metody setXXX i getXXX
public boolean equals(Object obj)
{
if (obj == null) return false;
if (!(obj instanceof MilitaryUnit))
return false;
MilitaryUnit that = (MilitaryUnit) obj;
if (this.getId() == null || that.getId() == null)
return false;
return (this.getId().equals(that.getId()));
}
public int hashCode()
{
int value getId() == null ?
getName().hashCode : getId().hashCode();
return value;
}
}
MilitaryUnit.j
ava
Implementacje
wymagane, jeżeli
instancje klas trwałych
mają być
przechowywane w
zbiorach
Set
Set
Rafał Kasprzyk
Asocjacja 1-N
<hibernate-mapping package="pl.isolution.hibernate.army"
>
<class name="MilitaryUnit" table="MilitaryUnit">
<id name="id" column="ID" type="long">
<generator class="increment" />
</id>
<property name= "name"/>
<property name= "potential"/>
…
<many-to-one name="superiorUnit"
column="SUPERIORUNIT_FK" class="MilitaryUnit" />
<many-to-one name="country"
column="COUNTRY_FK" class="Country" not-null= "true"/>
<set name="equipments" inverse="true" cascade="all">
<key column="MILITARY_UNIT_FK"/>
<one-to-many class="Equipment"/>
</set>
<set name="resources" inverse="true" cascade="all">
<key column="MILITARY_UNIT_FK"/>
<one-to-many class="Resources"/>
</set>
</class>
</hibernate-mapping>
MilitaryUnit.h
bm.xml
Rafał Kasprzyk
Asocjacja 1-N
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
Country c = new Country();
c.setName("Poland" );
c.setArea(322.577);
c.setMilitaryUnits(new HashSet());
MilitaryUnit mu = new MilitaryUnit();
mu.setName("3pl");
mu.setSoldiersNumber(30);
…
mu.setCountry(c);
c.getMilitaryUnits().add(mu);
session.save(c);
transaction.commit();
session.close();
Dla asocjacji
dwukierunkowej należy
obsłużyć oba jej
końce!!!
Dzięki cascade="all"
zachowany będzie
również powiązany z c
obiekt mu
Rafał Kasprzyk
Asocjacja dwukierunkowa –
metoda pomocnicza
public class Country {
…
public addUnit(MilitaryUnit mu){
if(mu.getCountry()!=null)
mu.getCountry()
.getMilitaryUnits().remove(mu);
mu.setCountry();
militaryUnits.add(mu);
}
}
W przypadku asocjacji
dwukierunkowej warto
zaimplementować metodę
pomocniczą
Country.
java
Rafał Kasprzyk
Encje Equipment i Resources
public class Equipment {
private Long id;
private String name;
private Integer norm;
private Integer efficientNumber;
private Integer destroyedNumber;
private String description;
private MilitaryUnit militaryUnit;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
…
// pozostałe metody setXXX i
getXXX
}
public class Resources{
private Long id;
private String name;
private Integer norm;
private Integer actualState;
private String measureUnit;
private String description;
private MilitaryUnit militaryUnit;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
…
// pozostałe metody setXXX i
getXXX
}
Stworzenie plików mapowań
dla tych encji nie
stanowi już problemu
Equipment.
java
Resurces.j
ava
Rafał Kasprzyk
Asocjacji N:N
Rafał Kasprzyk
Asocjacja N-N
public class MilitaryUnit {
private Long id;
private String name;
…
private Set missions;
…
// metody setXXX i
getXXX
}
<hibernate-mapping package="pl.isolution.hibernate.army" >
<class name="MilitaryUnit" table="MilitaryUnit">
<set name="missions"
table= "MilitaryUnitOnMission"
cascade="save-update">
<key column="MILITARY_UNIT_FK"/>
<many-to-many class="Mission"
column="MISSION_FK"
/>
</set>
</class>
</hibernate-mapping>
MilitaryUnit.j
ava
MilitaryUnit.h
bm.xml
Nie możemy
pozwolić na
kaskadowe
usuwanie
Rafał Kasprzyk
Asocjacja N-N
public class Mission {
private Long id;
private String name;
…
private Set militaryUnits;
…
// metody setXXX i getXXX
}
<hibernate-mapping package="pl.isolution.hibernate.army" >
<class name="Mission" table="Mission">
<set name="militaryUnits"
table= "MilitaryUnitOnMission"
inverse="true"
cascade="save-update">
<key column="MISSION_FK"/>
<many-to-many class="MilitaryUnit"
column="MISSION_UNIT_FK"
/>
</set>
</class>
</hibernate-mapping>
Mission.java
Mission.hbm
.xml
Drugi koniec
asocjacji
spowoduje
wygenerowanie
polecenia DML
(asocjacja
dwukierunkowa)
Rafał Kasprzyk
Asocjacji N-N
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
MilitaryUnit mu = (MilitaryUnit)
session.get(MilitaryUnit.class, new Long(15));
Mission m = (Mission)
session.get(Mission.class, new Long(7));
m.getMilitaryUnits().add(mu);
mu.getMissions().add(m);
session.save(m);
transaction.commit();
session.close();
Dla asocjacji
dwukierunkowej należy
obsłużyć oba jej
końce!!!
Dzięki cascade="save-
update" zachowany
będzie również
powiązany z m obiekt mu
Dziedziczenie
Rafał Kasprzyk
Dziedziczenie
Rafał Kasprzyk
<hibernate-mapping package="model.uczelnia">
<class name="Osoba" table= "Osoba">
<id name="oid" column name="oid" type= "long">
<generator class="increment"/>
</id>
<property name="imie"/>
<property name="nazwisko"/>
<joined-subclass name="Student" table="Student">
<key column name="oid"/>
<property name="rok">
</joined-subclass>
</class>
</hibernate-mapping>
Osoba.hbm.x
ml
Rafał Kasprzyk
Podsumowanie
Definicja obiektu trwałego
Deklaracja asocjacja 1-N
Deklaracja asocjacja N-N
Deklaracja i ”obsługa” asocjacji
dwukierunkowej
Deklaracja dziedziczenia