Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:ztb:2010:projekty:minibus:start [2010/06/01 23:44] ztb2010 |
pl:dydaktyka:ztb:2010:projekty:minibus:start [2019/06/27 15:50] (aktualna) |
| |
===== 8. Wybór encji (obiektów) i ich atrybutów ===== | ===== 8. Wybór encji (obiektów) i ich atrybutów ===== |
<code> | <code java> |
@Entity | @Entity |
@Table(name="COMPANIES") | @Table(name="COMPANIES") |
} | } |
| |
| |
| @Entity |
| @Table(name="COURSES") |
| @NamedQuery(name="findCourseByCompany", query="SELECT c FROM Course c WHERE c.owner.name = :name") |
| public class Course implements Serializable { |
| |
| private static final long serialVersionUID = 3008699718560976506L; |
| |
| @GeneratedValue(strategy=GenerationType.AUTO) |
| private long courseid |
| |
| @OneToOne |
| private Company owner; |
| |
| @Column(nullable=true) |
| private String description; |
| |
| @OneToMany(mappedBy="course", targetEntity=Stop.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER) |
| private List<Stop> stops; |
| } |
| |
| |
| @Entity |
| @Table(name="OPINIONS") |
| @NamedQuery(name="findOpinionByCompany", query="SELECT o FROM Opinion o WHERE o.company.name = :name") |
| public class Opinion implements Serializable { |
| |
| private static final long serialVersionUID = 2475121744579807544L; |
| |
| @GeneratedValue(strategy=GenerationType.AUTO) |
| private long opinionid; |
| |
| @ManyToOne |
| private Company company; |
| |
| @Column(nullable=true) |
| private boolean positive; |
| |
| @Column(nullable=true) |
| private String description; |
| } |
| |
| |
| @Entity |
| @Table(name="PLACES") |
| @NamedQueries({ |
| @NamedQuery(name="findPlaceByName", query="SELECT p FROM Place p WHERE p.city = :city AND p.name = :name"), |
| @NamedQuery(name="autocompletePlace", query="SELECT p FROM Place p WHERE p.city LIKE :city AND p.name LIKE :name"), |
| @NamedQuery(name="autocompletePlaceByCity", query="SELECT p FROM Place p WHERE p.city LIKE :city"), |
| @NamedQuery(name="autocompletePlaceByName", query="SELECT p FROM Place p WHERE p.name LIKE :name") |
| }) |
| public class Place implements Serializable { |
| |
| private static final long serialVersionUID = 7561920390812143011L; |
| |
| @GeneratedValue(strategy=GenerationType.AUTO) |
| private long placeid; |
| |
| @Column(nullable=false) |
| private String city; |
| |
| @Column(nullable=false) |
| private String name; |
| |
| @Column(nullable=true) |
| private BigDecimal lon; |
| |
| @Column(nullable=true) |
| private BigDecimal lat; |
| } |
| |
| |
| @Entity |
| @Table(name="STOPS") |
| @NamedQuery(name="findStopByPlace", query="SELECT s FROM Stop s WHERE s.place.city = :city and s.place.name = :name") |
| public class Stop implements Serializable { |
| |
| private static final long serialVersionUID = 2015220800633676479L; |
| |
| @GeneratedValue(strategy=GenerationType.AUTO) |
| private long stopid; |
| |
| @ManyToOne |
| private Course course; |
| |
| @OneToOne |
| private Place place; |
| |
| @Column(nullable=false) |
| private int orderNumber; |
| |
| @Column(nullable=true) |
| private BigDecimal cost; |
| |
| @Column(nullable=true) |
| private String hours; |
| } |
| |
| |
| @Entity |
| @Table(name="USERS") |
| public class User implements Serializable { |
| |
| private static final long serialVersionUID = 8651753619995718647L; |
| |
| @GeneratedValue(strategy=GenerationType.AUTO) |
| private long userid; |
| |
| @Column(nullable=false) |
| private String name; |
| |
| @Column(nullable=false) |
| private String password; |
| |
| @Column(nullable=false) |
| private String mail; |
| |
| @Column(nullable=false) |
| private int role = 1; |
| |
| @OneToMany(mappedBy="owner", targetEntity=Company.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER) |
| private Set<Company> companies; |
| } |
</code> | </code> |
| |
===== 9. Projektowanie powiązań (relacji) pomiędzy encjami (ERD) ===== | ===== 9. Projektowanie powiązań (relacji) pomiędzy encjami (ERD) ===== |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:erd.png|}} | {{:pl:dydaktyka:ztb:2010:projekty:minibus:erd2.png|}} |
| |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:std2.png|}} | {{:pl:dydaktyka:ztb:2010:projekty:minibus:std2.png|}} |
| |
| ===== 11. Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów ===== |
| |
===== <%TUTAJ WPISZ OSTATNIA CYFRE%>. Interfejs użytkownika (podstawowe elementy) ===== | <code sql> |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:aktualnosci.png|}} | CREATE TABLE companies |
| ( |
| id bigint NOT NULL, |
| "name" character varying(255) NOT NULL, |
| mail character varying(255) NOT NULL, |
| owner_id bigint, |
| CONSTRAINT companies_pkey PRIMARY KEY (id), |
| CONSTRAINT fk51e1f1bbedbce178 FOREIGN KEY (owner_id) |
| REFERENCES users (id) MATCH SIMPLE |
| ON UPDATE NO ACTION ON DELETE NO ACTION |
| ) |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:rejestracja.png|}} | |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:profil.png|}} | CREATE TABLE courses |
| ( |
| id bigint NOT NULL, |
| description character varying(255), |
| hours character varying(255), |
| owner_id bigint, |
| CONSTRAINT courses_pkey PRIMARY KEY (id), |
| CONSTRAINT fk63e4af986eae0d5e FOREIGN KEY (owner_id) |
| REFERENCES companies (id) MATCH SIMPLE |
| ON UPDATE NO ACTION ON DELETE NO ACTION |
| ) |
| |
| |
| CREATE TABLE opinions |
| ( |
| id bigint NOT NULL, |
| positive boolean, |
| description character varying(255), |
| company_id bigint, |
| CONSTRAINT opinions_pkey PRIMARY KEY (id), |
| CONSTRAINT fk176ead31d905f754 FOREIGN KEY (company_id) |
| REFERENCES companies (id) MATCH SIMPLE |
| ON UPDATE NO ACTION ON DELETE NO ACTION |
| ) |
| |
| |
| CREATE TABLE places |
| ( |
| id bigint NOT NULL, |
| city character varying(255) NOT NULL, |
| "name" character varying(255) NOT NULL, |
| lon numeric(19,2), |
| lat numeric(19,2), |
| CONSTRAINT places_pkey PRIMARY KEY (id) |
| ) |
| |
| |
| CREATE TABLE stops |
| ( |
| id bigint NOT NULL, |
| ordernumber integer NOT NULL, |
| "cost" numeric(19,2), |
| lag numeric(19,2), |
| place_id bigint, |
| course_id bigint, |
| CONSTRAINT stops_pkey PRIMARY KEY (id), |
| CONSTRAINT fk4b9009137509994 FOREIGN KEY (place_id) |
| REFERENCES places (id) MATCH SIMPLE |
| ON UPDATE NO ACTION ON DELETE NO ACTION, |
| CONSTRAINT fk4b90091894e45e0 FOREIGN KEY (course_id) |
| REFERENCES courses (id) MATCH SIMPLE |
| ON UPDATE NO ACTION ON DELETE NO ACTION |
| ) |
| |
| |
| CREATE TABLE users |
| ( |
| id bigint NOT NULL, |
| "name" character varying(255) NOT NULL, |
| "password" character varying(255) NOT NULL, |
| mail character varying(255) NOT NULL, |
| "role" integer NOT NULL, |
| CONSTRAINT users_pkey PRIMARY KEY (id) |
| ) |
| |
| |
| CREATE SEQUENCE hibernate_sequence |
| INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; |
| </code> |
| |
| ===== 12. Analiza zależności funkcyjnych i normalizacja tabel ===== |
| Wydaje się, że baza danych spełnia założenia 3NF. Wynika to z faktu, że przechowywane w niej dane są istnotnie atomiczne - z punktu widzenia implementacji projektu. W każdej tabeli atrybuty są w pełni bezpośrednio zależne od klucza głównego. Generalnie baza była projektowana tak by przy możlie maksymalnej funkcjonalności tabel, zapewnić trzecią postać normalną. |
| |
| ===== 13. Projektowanie operacji na danych ===== |
| Kwerendy i zapytania wynikają z mechanizmu mapowania obiektowo relacyjnego w j2ee i są poniekąd dostarczone przez klasę EntityManager standardu JPA Hibernate. Pozostałe zapytania w celu optymalizacji wydajności pracy aplikacji zrealizowane zostały jako NamedQuery - zapytania prekompilowane i stworzone przy użyciu składni HQL - Hibernate Query Language. Można je zobaczyć nad kodem encji do których przynależą. |
| |
| |
| ===== RAPORT KOŃCOWY ===== |
| |
| ===== 14. Stos technologiczny ===== |
| Aplikacja zrealizowana jest na bazie wzorca projektowego MVC (model widok kotroller). |
| Sklada sie z 3 wyraznie wyrożnionych warstw: |
| * baza danych - Postrgres 8.3, Mapowanie relacyjno obiektowe standard Java JPA Persistence |
| * logika biznesowa - Zrealizowana za pomocą technologii EJB 3.0 |
| * widok - Zrealizowany za pomocą JSF (java server faces 1.2) z nakładką jQery oraz jQueryUI |
| |
| |
| ===== 15. Implementacja bazy danych ===== |
| Patrz punkt 11. Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów. |
| |
| |
| ===== 16. Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych ===== |
| |
| -formularz rejestracji użytkownika |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:rejestracja1.png|}} |
| |
| |
| -formularz logowania użytkownika |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:logowanie1.png|}} |
| |
| |
| -formularz zakładania firmy przez użytkownika |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:dodawanie_firmy1.png|}} |
| |
| |
| -formularz edycji danych użytkownika |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:moje_dane.png|}} |
| |
| |
| -formularz dodawania komentarzy |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:komentarze1.png|}} |
| |
| |
| -formularz dodawania połączenia |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:dodawanie_polaczenia1.png|}} |
| |
| |
| -formularz wyszukiwania połączeń |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:wyszukiwanie1.png|}} | {{:pl:dydaktyka:ztb:2010:projekty:minibus:wyszukiwanie1.png|}} |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:wyszukiwanie2.png|}} | |
| |
{{:pl:dydaktyka:ztb:2010:projekty:minibus:dodawanie.png|}} | ===== 17. Zdefiniowanie dokumentów do przetwarzania i prezentacji danych ===== |
| |
| -prezentacja wyników wyszukiwania |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:wyszukiwanie1.png|}} |
| |
| |
| -prezentacja dodanej trasy |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:dodawanie_polaczenia2.png|}} |
| |
| |
| -prezentacja aktualnosci |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:aktualnosci1.png|}} |
| |
| |
| -prezentacja komentarzy |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:minibus:komentarze1.png|}} |