Lohdutus - tietokantadokumentti Ohjelmiston tietokanta on toteutettu Oracle-ympäristöön, ja sitä käytetään ohjelmassa Hibernaten kautta. Tietokannan rakenne Tietokannan taulujen merkitykset Taulu Project Users WorkHour ProjectType Customer WorkTypeSet WorkType Instructors Participants Customers WorkTypeSet_has_WorkType Message Sisältää Projektit Käyttäjät Tuntikirjaukset Projektityypit Asiakkaat Työtyyppisetit projekteille valittaviksi Tuntikirjaukseen tarvittavat työtyypit Projektin ohjaajat Projektiin osallistuvat henkilöt Projektin asiakkaat Työtyyppisetteihin sisältyvät työtyypit Ilmoitustaulun viestit
Cycle Syklit (ei vielä käytössä) Tietokannan rakenteen erityispiirteet Taulu Attribuutti Arvot Users Project Message usertype isactive priority 1 = tavallinen käyttäjä 5 = tutkija 10 = admin TRUE = projekti on aktiivinen FALSE = projekti ei ole aktiivinen 0 = korkea prioriteetti 1 = normaali prioriteetti 2 = matala prioriteetti Hibernate Tietokannan käsittely tapahtuu sovelluksessa Hibernaten avulla, jolloin tietokannasta haetaan tai sinne lisätään/päivitetään hibernateen määriteltyjä ja kuvattuja (mapped) POJO olioita. POJO oliot määritellään Hibernatelle Hibernate kuvausten (mapping) kautta, eli jokaista POJO luokkaa vastaa kuvaustiedosto <POJO-luokka>.hbm.xml samassa pakettihakemistossa kuin itse POJO luokka. Kuvauksessa määritellään mitkä POJO luokan muuttujat tallennetaan tietokantaan ja mitä saraketta ne tietokannassa vastaavat, eli ohjeistetaan miten hibernate käsittelee ko POJO luokkaa tietokannan kanssa. Hibernate ja uniikkien ID:n muodostus ID:n muodostus lisätyille taulujen riveille on Hibernaten vastuulla. Hibernate toteuttaa tämän Oracle:n sekvenssien (Sequences) avulla luoden oman sekvenssin nimeltään "HIBERNATE_SEQUENCE" jonka avulla ID:t muodostetaan (Sivuhuomautuksena MySQL:n kanssa hibernate käyttää MySQL:n autoincrement -määrettä). Tämä siis tarkoittaa, että yhtä sekvessilaskuria käytetään kaikkien ID:n muodostamiseen, ts samaa ID:ä ei esiinny edes sovelluksen kahden eri taulun riveillä. ID:n muodostustapaa voi hallita POJO luokkien <id> muuttujan asetuksia muuttamalla. Mahdollisuutena on esimerkiksi tehdä joka taululle oma sekvenssi. Tarkemmin tietoa http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mappingdeclaration-id. Nyt kaikilla POJO luokilla on hbm2ddl.auto tiedostoissa <id>:llä <generator> asetuksena "native".
Jos Hibernaten käyttämä oletus sekvenssi "HIBERNATE_SEQUENCE" puuttuu muodostaa Hibernate sen Hibernaten alustuksen yhteydessä jos hibernate.cfg.xml asetuksissa on hbm2ddl.auto asetuksella arvo "create" (Luo poistaa kuvauksissa esitettyt taulut ja luo ne uudelleen), "create-drop" (Ajaa DROP kaikille kuvauksissa esitellyille tauluille ja luo (CREATE) ne uudelleen) tai "update" (Päivittää (lisää) kuvauksissa esiintulleet eroavaisuudet nykyiseen schemaan). Erityishuomio "create" ja "create-drop" arvoille jotka siis myös poistavat taulujen sisällöt. Tietokannan luonti- ja nollauslauseet Hibernaten käyttämän oletussekvenssin luonti Huom. Hibernate luo tämän myös itse sen puuttuessa hbm2ddl.auto arvon olessa "update" hibernate.cfg.xml asetustiedostossa. Huom. sekvenssi aloitetaan alkamaan arvosta kaksi (2), jolloin ensimmäisen käyttäjän manuaalinen lisäys kantaan ei sekoita hibernaten id:n hallintaa. CREATE SEQUENCE HIBERNATE_SEQUENCE INCREMENT BY 1 START WITH 2 NOMAXVALUE MINVALUE 1 NOCYCLE CACHE 20 NOORDER; Taulujen luontilauseet CREATE TABLE Users firstname VARCHAR(45), familyname VARCHAR(45), user passwordhash VARCHAR(45) NOT NULL, usertype INTEGER NOT NULL, email VARCHAR(45), phonenr VARCHAR(45), adddate TIMESTAMP NOT NULL, CONSTRAINT uq_users UNIQUE(username), CONSTRAINT pk_users PRIMARY KEY(id) CREATE TABLE Customer firstname VARCHAR(45) NOT NULL, familyname VARCHAR(45) NOT NULL, email VARCHAR(45), organization VARCHAR(45), phonenr VARCHAR(45), adddate TIMESTAMP NOT NULL, CONSTRAINT pk_customer PRIMARY KEY(id) CREATE TABLE ProjectType description VARCHAR(400),
CONSTRAINT uq_projecttype UNIQUE(name), CONSTRAINT pk_projecttype PRIMARY KEY(id) CREATE TABLE WorkType description VARCHAR(400), CONSTRAINT uq_worktype UNIQUE(name), CONSTRAINT pk_worktype PRIMARY KEY(id) CREATE TABLE WorkTypeSet description VARCHAR(400), CONSTRAINT uq_worktypeset UNIQUE(name), CONSTRAINT pk_worktypeset PRIMARY KEY(id) CREATE TABLE WorkTypeSet_has_WorkType (worktypeid INTEGER, worktypesetid INTEGER, CONSTRAINT fk_worktypeset_has_worktype FOREIGN KEY(workTypeId) REFERENCES WorkType(id), CONSTRAINT fk_worktypeset_has_worktype2 FOREIGN KEY(workTypeSetId) REFERENCES WorkTypeSet(id) CREATE TABLE Project begintime DATE, endtime DATE, email VARCHAR(45), homepage VARCHAR(150), isactive VARCHAR(5) NOT NULL, worktypesetid INTEGER, projecttypeid INTEGER, description CLOB, CONSTRAINT uq_project UNIQUE(name), CONSTRAINT pk_project PRIMARY KEY(id), CONSTRAINT fk_project FOREIGN KEY(workTypeSetId) REFERENCES WorkTypeSet(id), CONSTRAINT fk_project2 FOREIGN KEY(ProjectTypeId) REFERENCES ProjectType(id) CREATE TABLE Participants (userid INTEGER, CONSTRAINT fk_participants FOREIGN KEY(userId) REFERENCES Users(id), CONSTRAINT fk_participants2 FOREIGN KEY(projectId) REFERENCES Project(id)
CREATE TABLE Instructors (userid INTEGER, CONSTRAINT fk_instructors FOREIGN KEY(userId) REFERENCES Users(id), CONSTRAINT fk_instructors2 FOREIGN KEY(projectId) REFERENCES Project(id) CREATE TABLE Customers (customerid INTEGER, CONSTRAINT fk_customers FOREIGN KEY(customerId) REFERENCES Customer(id), CONSTRAINT fk_customers2 FOREIGN KEY(projectId) REFERENCES Project(id) CREATE TABLE WorkHour hours FLOAT NOT NULL, description VARCHAR(100), wdate DATE, userid INTEGER, worktypeid INTEGER, CONSTRAINT pk_workhour PRIMARY KEY(id), CONSTRAINT fk_workhour FOREIGN KEY(projectId) REFERENCES Project(id), CONSTRAINT fk_workhour2 FOREIGN KEY(userId) REFERENCES Users(id), CONSTRAINT fk_workhour3 FOREIGN KEY(workTypeId) REFERENCES WorkType(id) CREATE TABLE Message ( id INTEGER, text VARCHAR(300), userid INTEGER, timestamp TIMESTAMP, priority NUMBER(3), CONSTRAINT pk_message PRIMARY KEY(id), CONSTRAINT fk_message FOREIGN KEY(projectId) REFERENCES Project(id), CONSTRAINT fk_message2 FOREIGN KEY(userId) REFERENCES Users(id) CREATE TABLE Cycle starttime DATE NOT NULL, endtime DATE NOT NULL, cyclenr INTEGER NOT NULL, CONSTRAINT pk_cycle PRIMARY KEY(id), CONSTRAINT fk_cycle FOREIGN KEY(projectId) REFERENCES Project(id) Tietokannan nollaus Huom. Nollaus voidaan toteuttaa myös Hibernaten avulla asettamalla hbm2ddl.auto asetuksen arvo joko "create" tai "create-drop" hibernate.cfg.xml asetustiedostossa.
DROP TABLE Cycle; DROP TABLE Message; DROP TABLE WorkHour; DROP TABLE Participants; DROP TABLE Instructors; DROP TABLE Customers; DROP TABLE Customer; DROP TABLE Project; DROP TABLE WorkTypeSet_has_WorkType; DROP TABLE WorkTypeSet; DROP TABLE WorkType; DROP TABLE ProjectType; DROP TABLE Users; DROP SEQUENCE HIBERNATE_SEQUENCE;