Eksam Kodepræsentation PDF
Document Details
Uploaded by ExaltingHolly
Tags
Summary
This document gives a presentation of source code about databases using java (Hibernate).
Full Transcript
HibernateConfig: Klassen er central for at konfigurere og administrer EntityManagerFactory i java applikationen, der bruger Hibernate. Den skaber instanser af EntityManager som håndterer databaseralationer. EntityManagerFactory er essentiel del af JPA, som styrer livscyklussen for entityManager ins...
HibernateConfig: Klassen er central for at konfigurere og administrer EntityManagerFactory i java applikationen, der bruger Hibernate. Den skaber instanser af EntityManager som håndterer databaseralationer. EntityManagerFactory er essentiel del af JPA, som styrer livscyklussen for entityManager instanser. Disse står for at integrere med databasen. Konfiguration: Klassen viser, hvordan man konfigurerer Hibernate med properties og annotations. Hibernate funger som ORM(object relation mapping) værktøj, der oversætter mellem java objekter og databasetabeller. Annotation baseret konfiguration metoden tilføjer annoterede klasser som User, Role, Trip og Guide til hibernate. Og ved hjælp af disse annotation (vi kommer til at kigge på dem i entities) laver java klasser til Db tabeller. Miljø specifik konfiguration: VI har Udvikling vs test vs produktion. Trip: Klassen repræsenter en trip og er kortlagt til en tabel i en relatione database via JPA-annotations. Vi arbejder med relationel databaser vil jeg bare sige. Jeg bruger JPA annotations som Entity og Table name ”trip”, som marker klassen som en JPA entitet og kortlægger den til en tabel i db med navn trip. Primært nøgle: Id og GeneratedValue(strategy= GenerationType.IDENTITY): id feltet er markeret som primær nøgle og GenerationType.IDENTITY indiker at værdien automatisk genereres af databasen. Kolonneegenskaber: ved hjælp af Colum laver jeg de forskellige tabeller i databasen. Nullable=false angiver at disse felter ikke må indeholde null-værdier. Enum mapping @Enumerated(EnumType.STRING): tripCategory feltet burger en Enum, som er gemt i databasen som en String. Som giver en læsbar værdi i db. Relationer: ManyToOne: Trip har mange til en relation til Guide. Som betyder at hver trip er tilknyhttet præcis en guide, mens en guide kan have mange trips. @JoinColumn(name = "guide_id"): Relationen er gemt i trip tabellen som en fremmed nøgle guide_id, som refererer til primær nøglen i guide tabellen. Konstruktor: Trip(TripDTO tripDTO) er en hjælpe konstruktør, der tillader oprettelse af en Trip entitiet fra en TripDTO. Dette skaber en klar separation mellem dataoverførselsobjekter og domænemodellen, hvilke forbedrer applikationens fleksibilitet og struktur. Jeg bruger samme principper i Guide entity. Den har en OneToMany relation til Trip. Som betyder at hver guide kan have flere trip, hvilken betydel at Trip entity referer tilbage til Guide gennem mappebBy=”guide”. cascade = CascadeType.ALL: Alle ændringer på en Guide (f.eks. oprettelse, opdatering, sletning) vil også blive anvendt på de tilknyttede Trips. orphanRemoval = true: Hvis en Trip fjernes fra Guide's trips set, bliver denne Trip også fjernet fra databasen, hvilket sikrer dataintegritet. Jeg vil lige også nævne at vi har en bidirectional relation. Som betyder at både parent og child entity ved godt at den anden eksister. Som betyder at en Guide kan se de Trips den er knyttet til, og en Trip ved hvilken Guide der leder turen. DTOS Data Transver object bruges til at transportere data mellem forskellige lag af applikationen, især mellem controller-laget og service-laget, eller mellem back and front end. De hjælper med at reducere kobling mellem domænemodellen og API-responser. TripDTO- klassen Den repræsenter data, der sendes mellem applicationens backend og klienten. Den adskiller sig fra Trip entity, som er tæt knyttet til databasen, og fokuserer på nødvendig data for klienten. Grundlæggende felter som id, name osv. Repræsenter centrale attributter af en trip. Disse er afspejling af Trip-entity, men i en form tilpasset til overførsel. Relationer: TripDTO indkluder reference til en GuideDTO, hvilket viser at dataen overfører en version af Guide entity. Som holder JSON responsen kompakt og relevant for klienten. Bidirektionaliteten mellem Trip og Guide i entitirerne bliver her præsenteret som en enkel relation i DTO’en, hvilken reduceret kompleksiteten for Klienten (Jeg kommer til at udybbe når vi snakker om DAOS). Hvad er fordele med at bruge DTO: adskiller domænemodellen (entities) fra API responer, forhindring af overførsel af unødvendige data. DAOS: IDAO er et generic interface, der definerer grundlæggende CRUD operations. Vi bruger generics til gøre IDAO fleksibelt og genanvendelig. Vi opretter statisk variabel entitymanagerfactory en gang i hele applikationen. TripDAO implementer IDAO, hvilke betyder, at det arbejder med TripDTO som datatransferobjekter og bruger Integer som typen for den primere nøgle(id). Read metoden: Læser en enkelt Trip fra databasenved hjælp af dens id, og derefter retuner en TripDTO efter konvertering fra Trip-entitien. readAll(): henter alle trips fra databasen. JPQL forespørgsel bruges til at konvertere hver Trip til TripDTO i foresåøgslen, hvilket gør resultatsættet klar til brug uden yderligere konvertering. Create() Skaber en ny Trip i databasen baseret på data fra TripDTO Konverter TripDTO til en Trip entity, persister den i db og returner en ny TripDTO med den oprettede Trip. Update optader en eksisterende trip ved at finde den i db og opdateger felter i den med felter fra TripDTO. Delete: sletter en trip fra db ved hjælp af dens id. RELATION I DTO selvom GuideDTO ikke indeholde trips, kan trips for en guide hentes ved hjælp af getTripsByGuide metoden. Denne metode bruger JPQL til at hente og returnere alle trips knyttet til en bestemt guide som TripDTOer. Vi bruger endu en interface ITRIPGUIDEDAO. addGuideToTrip metoden: Denne metode tilføjer en guide til en tur ved at opdatere turens Guide felt. Dette demonstrerer den bidirektionelle relation i entiteterne, hvor en Trip er knyttet til en Guide. getTripsByGuide metoden bruges til at hente alle ture som guide er ansvalig for. Denne metode demonstrerer, hvordan relationen mellem Trip og Guide kan navigeres effektivt fra TripDAO. TripDAO fungerer som bro mellem databasen og applikationen og implementerer CRUD-operationer samt metoder til at håndtere relationen mellem Trip og Guide GuideDAO Ved at fokusere på delete, update, readAll, og read sikrer GuideDAO, at de mest almindelige og nødvendige operationer for at håndtere guider bliver håndteret effektivt TripController: Funger som en bridge mellem http requests der modtages af Javalin og TripDAO som håndterer dboperationer. Constructor: initialiser TripDAO med EntityManagerFactory, som hentes fra HibernateConfig, som sikre at controller har adgang til daoen. readAll: henter alle trips ved at kalde Trip.DAO.readAll metoden og returner dem som JSON. Read() Henter en specifik tur baseret på ID, hvis turen findes inkluderes også pakkelisteellementer (ExternAPI som vi vil tale om senere), der hentes via PackingService. Create() Opretter en ny trip vved at modtage json data, konvertere dem til tripDTO og kalde Dao create metoden. Update() Opdaterer en eksisterende trip baseret på id og nye data fra TripDTO. Delete() Sletter en tur baseret på id. Extra funktionaliteter: addGuideToTrip Tilknytter en guide til en trip ved hjælp af tripId og guideId getTripsByGuide henter alle tur for en specifik guide ved hjælp af guideId. filterTripsByCategory Filtrer trip baseret på en category og returnere machende ttrips. getTotalPriceByGuide beregne og returner den samlede pris for alle ture for hver guide. Integration med Ekstern API fetchPackingItemsForTrip() henter pakkelisteelementer for en specifik tur baseret på dens kattegori. getPackingItemsWeight Beregner samlede vægt af pakkelisteelementer for en trip. Hvordan det hele hænger sammen Controller: TripController modtager HTTP-forespørgsler, validerer data og sender dem videre til TripDAO for databaseoperationer. Data fra DAO'en konverteres derefter til JSON, som returneres til klienten. DAO: TripDAO håndterer databaseadgangen og CRUD-operationerne for Trip-entiteter. DTO: TripDTO bruges til at flytte data mellem controlleren og DAO'en, hvilket sikrer, at kun nødvendige data sendes til klienten. PackingService: Integrerer med en ekstern API for at hente pakkelisteelementer baseret på turens kategori. TripRoutes Definere endpoints for Controller. Routes Denne klasse organiserer alle TripRoutes under en samlet rute 7trips. Routes bliver håndteret i AppConfig ApplicationConfig: Hånter opsætning af Javalin Applikationen Angiver, at alle ruter skal have /api som base-path. config.router.apiBuilder(routes.getRoutes()): Registrerer ruterne fra Routes-klassen. Security: Integrerer også SecurityRoutes for at håndtere sikkerhed og autentificering. Starter og stopper server Og Håndterer exceptions: generalExceptionHandler og apiExceptionHandler PackingService Intereagere med en ektern API. 1. PackingService Class PackingService er designet til at interagere med den eksterne pakkeliste-API. Nøgleelementer: BASE_URL_PACKING: Base URL for API'et, hvor {category} bliver tilføjet dynamisk afhængigt af den kategori, brugeren ønsker at hente. HttpClient og ObjectMapper: o HttpClient: Bruges til at sende HTTP-forespørgsler. o ObjectMapper: Bruges til at deserialisere JSON-responsen fra API'et til Java-objekter (PackingResponseDTO). o Konfigureret med JavaTimeModule for at håndtere ZonedDateTime-formateringen i createdAt og updatedAt. fetchPackingItems(String category) Formål: Henter pakkelisteelementer baseret på turens kategori. Arbejdsgang: 1. Bygger en GET-forespørgsel til API'et med den specificerede kategori. 2. Sender forespørgslen og håndterer svaret. 3. Hvis svaret er succesfuldt (HTTP 200), deserialiseres JSON-responsen til PackingResponseDTO og returnerer listen af PackingItemDTO. 4. Ved fejl returneres en tom liste, og fejlen logges. PackingResponseDTO Class Formål: Indkapsler API-responsens struktur, som indeholder en liste af PackingItemDTO. Annotationer: o @JsonIgnoreProperties(ignoreUnknown = true): Ignorerer ukendte felter i JSON-responsen, hvilket gør DTO'en mere robust mod API-ændringer. PackingItemDTO Class Formål: Repræsenterer et individuelt pakkelisteelement. Felter: o name, weightInGrams, quantity, description, category, createdAt, updatedAt: Repræsenterer data, der beskriver et pakkelisteelement. o buyingOptions: En liste over købsmuligheder (BuyingOptionDTO), som indeholder oplysninger om butiksnavn, URL, og pris. TripControllerTest enne klasse bruger Javalin til at køre applikationen og RestAssured til at sende HTTP-forespørgsler og verificere svarene. @TestInstance(TestInstance.Lifecycle.PER_CLASS): Dette gør, at testinstansen oprettes én gang pr. klasse, hvilket gør det muligt at genbruge ressourcer som EntityManagerFactory og Javalin-applikationen på tværs af tests. BeforeAll: setUpAll() kører én gang før alle tests. Starter Javalin-serveren på port 7070 ved at kalde ApplicationConfig.startServer(7070). @BeforeEach: setUp() kører før hver enkelt test. Rydder databasen og indsætter testdata for guider og ture. @AfterEach: tearDown() kører efter hver test og rydder databasen for at sikre, at hver test kører i et rent miljø. @AfterAll: tearDownAll() kører efter alle tests og stopper Javalin-serveren. TripControllerTest tester de vigtigste CRUD-operationer og nogle ekstra funktioner i din TripController. Testene sikrer, at API'et fungerer korrekt og returnerer de forventede resultater. Disse tests er essentielle for at validere, at din applikation håndterer data korrekt og svarer med passende statuskoder og data.