A feladatokban egy úgynevezett Activity Tracker alkalmazás szimulációját kell megvalósítani, mellyel nyilvántarthatjuk sportolási tevékenységeinket, és lekérdezhetjük eredményeinket.
Ellenőrizd, hogy fut-e a MySQL szerver a lokális számítógépen (localhost
)!
Jelentkezz be root
felhasználóval HeidiSQL kliens használatával, és futtasd le a következő
parancsot:
use mysql;
create schema if not exists activitytracker default character set utf8 collate utf8_hungarian_ci;
create user 'activitytracker'@'localhost' identified by 'activitytracker';
grant all on *.* to 'activitytracker'@'localhost';
Ekkor létrejön az activitytracker
séma, és az activitytracker
felhasználó, ugyanezzel a jelszóval.
Írj egy activitytracker.Activity
osztályt, mely attribútumai:
id
- egyedi azonosító, egész számstartTime
- kezdési idő,LocalDateTime
description
- szöveges leírás (vigyázz, adesc
foglalt szó SQL-ben)type
- felsorolásos típus, mely felveheti a következő értékeket:BIKING
,HIKING
,RUNNING
,BASKETBALL
Írj egy activitytracker.ActivityTrackerMain
osztályt, mely egy main()
metódusban, mely példányosít pár Activity
példányt, és értéküket beszúrja az activities
táblába! Az adatbázisban hozd létre az activities
táblát! Az id
értékét
az adatbázis automatikusan generálja számunkra (GenerationType.IDENTITY
)!
A mezőnevek legyenek hasonlóak az osztály attribútumainak neveihez, azonban a szavakat aláhúzásjel (_
) válassza el!
Amennyiben kész, szervezd ki a beszúrást egy külön metódusba!
A main()
metódusban próbáld ki a listázást, beolvasást id alapján, módosítást és törlést!
Hozz létre egy ActivityDao
osztályt a következő metódusokkal:
void saveActivity(Activity)
List<Activity> listActivities()
Activity findActivityById(long id)
void deleteActivity(long id)
Hozz létre egy integrációs tesztet!
Módosítsd úgy az Activity
osztályt, hogy ne a type
sorszáma, hanem a neve kerüljön az adatbázisban elmentésre!
Módosítsd úgy az oszlopok konfigurációját, hogy a startTime
, description
és type
is kötelező legyen (nem lehet null
)!
A description
mező hossza maximum 200 karakter lehet, a type
mező hossza maximum 20 karakter.
Módosítsd az Activity
osztályt, hogy ne auto_increment
mező alapján történjen az azonosítókiosztás, hanem a Hibernate
saját táblája alapján! Legyen a tábla neve act_id_gen
, mezői rendre id_gen
és id_val
!
Hozz létre az Activity
osztályban egy createdAt
mezőt, valamint egy updatedAt
mezőt, mind a kettő
LocalDateTime
tipusú legyen! Mielőtt lementésre kerül, a Hibernate állítsa be a createdAt
mező értékét
az aktuális időre! Módosítás esetén a Hibernate automatikusan állítsa be az updatedAt
mező értékét!
Írj a dao-ba egy metódust:
void updateActivity(long id, String description)
Ez módosítsa az adott azonosítójú aktivitás leírását a második paraméterként megadottra! Ezzel ellenőrizheted, hogy működnek-e a mentések.
Hozz létre egy integrációs tesztet!
Lehessen az aktivitást címkékkel ellátni! Legyen az Activity
osztálynak egy List<String> labels
attribútuma.
Legyen egy új metódus, mely az aktivitásokat a címkékkel együtt tölti be!
Activity findActivityByIdWithLabels(long id)
Hozz létre egy integrációs tesztet!
Az aktivitásokhoz pontokat is lehet felvinni, ha pl. GPS-szel nyomon követtük a mozgásunk, pl. a futásunk.
Írj egy TrackPoint
osztályt (entitást), melynek attribútumai:
id
- egyedi azonosítótime
-LocalDateTime
latitude
éslongitude
- koordináták, szélességi és hosszúsági fok
Az Activity
tartalmazzon egy List<TrackPoint>
attribútumot!
Legyen a két entitás között kétirányú 1-n kapcsolat, azaz egy aktivitáshoz több pont tartozhat, de
egy pont csak egy aktivitáshoz tartozhat. Legyen a mentés és törlés kaszkádolt!
A pontokat mindig a time
nevű attribútuma alapján növekvő sorrendben töltse be!
Legyen egy új metódus, mely az aktivitásokat a pontokkal együtt tölti be!
Activity findActivityByIdWithTrackPoints(long id)
Hozz létre egy integrációs tesztet!
Hozz létre egy tájegység entitást (Area
)! Legyen egy azonosítója és neve.
Egy aktivitáshoz több tájegységet is hozzá lehet rendelni, és egy tájegységben többször is mozoghatunk. Ezért alakíts ki egy kétirányú m-n kapcsolatot a két entitás között!
Írj egy AreaDao
osztályt, mellyel el lehet menteni egy tájegységet!
Hozz létre egy integrációs tesztet!
A tájegységhez kapcsolódjon 1-n kétirányú kapcsolattal a települések (City
entitás).
Azonban a tájegységben található településeket egy Map
-ben kell nyilvántartani,
ahol a kulcs a település neve. Legyen kaszkádolt mentés és törlés.
Map<String, City>
A City
entitás tartalmazza a következő attribútumokat:
id
- egyedi azonosítóname
- település nevepopulation
- népesség
Hozz létre egy integrációs tesztet!
Legyenek az Activity
entitásnak további attribútumai!
distance
- össztávduration
- hossz, egész szám másodpercben
Ezen oszlopok értékeit szervezd ki egy másodlagos activity_details
táblába!
Egy teljesen külön projektbe dolgozz!
Hozz létre benne egy Activity
entitást a következő mezőkkel:
id
- egyedi azonosító, egész számstartTime
- kezdési idő,LocalDateTime
description
- szöveges leírás
Hozz létre két leszármazottat: SimpleActivity
és ActivityWithTrack
.
Az előbbi tartalmazzon egy plusz attribútumot:
place
- szöveges típusú, hol történt az aktivitás
Az utóbbi tartalmazzon további két attribútumot:
distance
- össztávduration
- hossz, egész szám másodpercben
Vizsgáld meg, hogy lehet az öröklődést konfigurálni!
Hozz létre egy metódust, mely azon aktivitásokhoz tartozó pontok koordinátáit adja vissza, melyek a paraméterként megadott dátum után történtek! Lehessen lapozást megadni! A lekérdezést named query-ben add meg!
List<Coordinate> findTrackPointCoordinatesByDate(LocalDateTime afterThis, int start, int max)
Ehhez hozz létre egy Coordinate
DTO-t, melynek egy latitude
és longitude
attribútuma van!
Írj egy metódust, mely tevékenységenként visszaadja (tevékenység leírását adja vissza), hogy hány pont tartozik hozzá, név szerint rendezett sorrendben!
List<Object[]> findTrackPointCountByActivity()
Írj egy olyan metódust, mely kitörli a paraméterül megadott dátum után szereplő bizonyos típusú tevékenységeket!
public void removeActivitiesByDateAndType(LocalDateTime afterThis, ActivityType type)
Egy új projektbe másold át az osztályokat, és módosítsd úgy, hogy Spring Frameworkkel működjön!
Egy új projektbe másold át az osztályokat, és módosítsd úgy, hogy Spring Boottal működjön!
Másold le a Spring Bootos projektet, és módosítsd, hogy Spring Data JPA repository legyen!
Egy új projektbe másold át az osztályokat, és módosítsd úgy, hogy Java EE-t használva egy Wildfly alkalmazásszerveren belül működjön!
Vagy a Spring Data JPA vagy a Java EE projektből indulj ki, és hozz létre egy LogEntry
entitást, valamint hozzá egy repository-t, DAO-t. Activity mentése esetén hívd meg
a LogEntryDao
-t úgy, hogy mentsen el egy LogEntry
-t, külön tranzakcióban.