background image

Przykładowa aplikacja

Rafał Kasprzyk

background image

Rafał Kasprzyk

Diagram klas wybranej 

dziedziny 

Implementa

cja asocjacji 

jednokierun

kowej

Implementa

cja asocjacji 

dwukierunk

owej

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

Rafał Kasprzyk

Asocjacji N:N

background image

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

background image

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)

background image

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

background image

Dziedziczenie

Rafał Kasprzyk

background image

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

background image

Rafał Kasprzyk

Podsumowanie

Definicja obiektu trwałego

Deklaracja asocjacja 1-N

Deklaracja asocjacja N-N

Deklaracja i ”obsługa” asocjacji 

dwukierunkowej

Deklaracja dziedziczenia


Document Outline