Biblioteka(AndroMDA+JSF+Spring+JPA) -część VI- model dziedziny
Ponieważ moja aplikacyjka nie będzie posiadała zbyt rozbudowanej funkcjonalności, sam model dziedziny również nie będzie zbyt finezyjny :).
Program ma umożliwić rejestrację Wypożyczeń(posiada daty od i do) i Rezerwacji(data rezerwacji) przez Czytelników zarejestrowanych w Bibliotece. Każdy Czytelnik jest Osobą posiadającą swoje imię i nazwisko, oraz numer biblioteczny. Z Czytelnikiem związana jest również lista jego Rezerwacji oraz Wypożyczeń. Rezerwacje i Wypożyczenia dotyczą Książek. Sama Książka posiada swój tytuł, oraz numer katalogowy.Każda Książka mogła zostać napisana przez wielu Autorów (jest to Osoba z imieniem i nazwiskiem, oraz unikalnym identyfikatorem autora).Każdy Autor z kolei mógł napisać wiele Książek.
Myślę że na początek to wystarczy. Pora wykonać model.
Uruchamiam ArgoUML z załadowanym profilem AndroMDA, zakładam pakiet "dziedzina" i przygotowuje projekt. Wygląda on mniej więcej tak:
Dokładna instrukcja, w oparciu o którą tworzyłem obiekty dziedziny zamieszczona jest na stronach dokumentacji cartridge'a EJB3 .
Według mnie na kilka, absolutnie kluczowych zasad należy zwrócić szczególną uwagę.
Przede wszystkim, do naszego projektu powinien zostać załadowany profil AndroMDA dla ArgoUML (o sposobie jego instalowania i osadzania w projekcie pisałem we
wcześniejszym poście).
Po drugie, wszystkie encje muszą być oznaczone stereotypem "Entity".
Po trzecie, typy dla atrybutów encji muszą pochodzić z załadowanego profilu.
W przypadku ArgoUML, typ atrybutu pochodzący z profilu wygląda tak:
Skoro mój model dziedziny jest już gotowy pora wygenerować kod. W tym celu eksportuje model do formatu xmi (File-Export XMI...). Wygenerowany plik zapisuję jako "biblioteka.xmi" w ścieżce "mda/src/main/uml/biblioteka.xmi".
Teraz tylko uruchomienie pluginu
i następuje przetwarzanie modelu:
INFO [AndroMDA] - core initialization complete: 13.07[s] -
INFO [AndroMDA] loading model --> 'file:/dane/projekty/sandbox/biblioteka/mda/src/main/uml/biblioteka.xmi'
INFO [AndroMDA] referenced model --> 'file:/dane/projekty/sandbox/biblioteka/mda/src/main/uml/andromda-profile-32-noextensions.xmi'
INFO [AndroMDA] - loading complete: 6.005[s] -
INFO [AndroMDA] - validating model -
Klasy wynikowe, zgodnie z przygotowaną przeze mnie konfiguracją pluginu AndroMDA trafiają do modułu "model", do pakietu "dziedzina"
Kod dla najbardziej złożonej klasy Czytelnik wygląda następująco:
//
// Attention: Generated code! Do not modify by hand!
// Generated by: EntityEmbeddable.vsl in andromda-ejb3-cartridge.
//
package dziedzina;
import java.io.Serializable;
import java.util.Set;
import java.util.TreeSet;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
/**
* Autogenerated POJO EJB class for Czytelnik containing the
* bulk of the entity implementation.
*
* This is autogenerated by AndroMDA using the EJB3
* cartridge.
*
* DO NOT MODIFY this class.
*
*
*/
@Entity
@DiscriminatorValue("C")
@NamedQuery(name = "Czytelnik.findAll", query = "select czytelnik from Czytelnik AS czytelnik")
public class Czytelnik
extends Osoba
implements Serializable
{
private static final long serialVersionUID = 7232739200991516470L;
// ----------- Attribute Definitions ------------
private String numerBiblioteczny;
// --------- Relationship Definitions -----------
private Set<Wypozyczenie> listaWypozyczen = new TreeSet<Wypozyczenie>();
private Set<Rezerwacja> listaRezerwacji = new TreeSet<Rezerwacja>();
// ---- Manageable Display Attributes (Transient) -----
// --------------- Constructors -----------------
/**
* Default empty constructor
*/
public Czytelnik() {}
/**
* Implementation for the constructor with all POJO attributes except auto incremented identifiers.
* This method sets all POJO fields defined in this class to the values provided by
* the parameters.
*
* @param imie Value for the imie property
* @param nazwisko Value for the nazwisko property
* @param numerBiblioteczny Value for the numerBiblioteczny property
*/
public Czytelnik(String imie, String nazwisko, String numerBiblioteczny)
{
setImie(imie);
setNazwisko(nazwisko);
setNumerBiblioteczny(numerBiblioteczny);
}
/**
* Constructor with all POJO attribute values and CMR relations.
*
* @param imie Value for the imie property
* @param nazwisko Value for the nazwisko property
* @param numerBiblioteczny Value for the numerBiblioteczny property
* @param listaWypozyczen Value for the listaWypozyczen relation
* @param listaRezerwacji Value for the listaRezerwacji relation
*/
public Czytelnik(String imie, String nazwisko, String numerBiblioteczny, Set<Wypozyczenie> listaWypozyczen, Set<Rezerwacja> listaRezerwacji)
{
setImie(imie);
setNazwisko(nazwisko);
setNumerBiblioteczny(numerBiblioteczny);
setListaWypozyczen(listaWypozyczen);
setListaRezerwacji(listaRezerwacji);
}
// -------- Attribute Accessors ----------
/**
* Get the numerBiblioteczny property.
*
* @return String The value of numerBiblioteczny
*/
@Column(name = "NUMER_BIBLIOTECZNY", insertable = true, updatable = true)
public String getNumerBiblioteczny()
{
return numerBiblioteczny;
}
/**
* Set the numerBiblioteczny property.
* @param value the new value
*/
public void setNumerBiblioteczny(String value)
{
this.numerBiblioteczny = value;
}
// ------------- Relations ------------------
/**
* Get the listaWypozyczen Collection
*
* @return Set<Wypozyczenie>
*/
@OneToMany(mappedBy = "czytelnik")
public Set<Wypozyczenie> getListaWypozyczen()
{
return this.listaWypozyczen;
}
/**
* Set the listaWypozyczen
*
* @param listaWypozyczen
*/
public void setListaWypozyczen (Set<Wypozyczenie> listaWypozyczen)
{
this.listaWypozyczen = listaWypozyczen;
}
/**
* Get the listaRezerwacji Collection
*
* @return Set<Rezerwacja>
*/
@OneToMany(mappedBy = "czytelnik")
public Set<Rezerwacja> getListaRezerwacji()
{
return this.listaRezerwacji;
}
/**
* Set the listaRezerwacji
*
* @param listaRezerwacji
*/
public void setListaRezerwacji (Set<Rezerwacja> listaRezerwacji)
{
this.listaRezerwacji = listaRezerwacji;
}
// -------- Common Methods -----------
/**
* Indicates if the argument is of the same type and all values are equal.
*
* @param object The target object to compare with
* @return boolean True if both objects a 'equal'
*/
public boolean equals(Object object)
{
if (this == object)
{
return true;
}
if (!(object instanceof Czytelnik))
{
return false;
}
final Czytelnik that = (Czytelnik)object;
if (this.getId() == null || that.getId() == null || !this.getId().equals(that.getId()))
{
return false;
}
return true;
}
/**
* Returns a hash code value for the object
*
* @return int The hash code value
*/
public int hashCode()
{
int hashCode = super.hashCode();
hashCode = 29 * hashCode + (getId() == null ? 0 : getId().hashCode());
return hashCode;
}
/**
* Returns a String representation of the object
*
* @return String Textual representation of the object displaying name/value pairs for all attributes
*/
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("Czytelnik(=");
sb.append(super.toString());
sb.append("numerBiblioteczny: ");
sb.append(getNumerBiblioteczny());
sb.append(")");
return sb.toString();
}
}
Żeby dowiedzieć się czy wygenerowany kod jest naprawdę w porządku, przygotuję kilka testów jednostkowych. Tyle że opiszę je już następnym razem....