Ein umfassendes Lernprojekt fĂźr den Kurs "Relationale Datenbanken" der HĂśheren Fachschule fĂźr Technik Mittelland zur praktischen Demonstration von Object Relational Mapping (ORM) mit modernen Java-Technologien.
đ Kurs-Website
Dieses Projekt vermittelt Studierenden folgende Kernkonzepte:
- Object Relational Mapping (ORM) mit Hibernate/JPA
- Spring Boot Fundamentals - Dependency Injection, Auto-Configuration
- Clean Architecture - Separation of Concerns zwischen Entity-, DTO-, Service- und Repository-Schichten
- Datenbankmanagement - PostgreSQL Integration, Flyway Migrationen
- Containerisierte Entwicklung - Docker Compose fĂźr lokale Umgebung
- Type-Safe Object Mapping - MapStruct fĂźr sichere Objekttransformationen
- Spring Boot 3.4.6 - Enterprise Java Framework
- Java 21 - Moderne Java-Features und Performance
- Hibernate/JPA - Object Relational Mapping
- PostgreSQL 17 - Relationale Datenbank
- Flyway - Datenbankmigrationen
- Thymeleaf - Server-side HTML Templating
- Bootstrap CSS - Responsive Web Design
- Maven - Build Management und Dependency Resolution
- Testcontainers - Integration Testing mit containerisierten Datenbanken
- Docker Compose - Lokale Entwicklungsumgebung
- Java 21 oder hĂśher (OpenJDK empfohlen)
- Maven 3.6+ fĂźr Build Management
- Docker & Docker Compose fĂźr die Datenbankumgebung
- Git fĂźr Versionskontrolle
git clone <repository-url>
cd transferdemo
# PostgreSQL Datenbank mit Docker Compose starten
docker-compose -f docker-compose.db.yaml up -d
# ĂberprĂźfen, ob die Datenbank läuft
docker ps
# Dependencies installieren und Code kompilieren
mvn clean compile
# Anwendung starten
mvn spring-boot:run
# Alternative: Mit spezifischem Profil
mvn spring-boot:run -Dspring-boot.run.profiles=local
- Webanwendung: http://localhost:8080
- Datenbank: PostgreSQL auf localhost:5432
- Database:
transferdemo
- Username:
transferdemo
- Password:
transferdemo
- Database:
Das Projekt folgt einer Layered Architecture mit klarer Trennung der Verantwortlichkeiten:
src/main/java/ch/hftm/relationaldatabases/transferdemo/
âââ web/ # đ Presentation Layer
â âââ NoteController # HTTP Endpoints & Request Handling
âââ services/ # đź Business Logic Layer
â âââ NoteService # Geschäftslogik & Transaktionsmanagement
âââ mappers/ # đ Object Mapping Layer
â âââ NoteMapper # Entity â DTO Mapping
â âââ NoteFormMapper # Form â DTO Mapping
âââ dtos/ # đ Data Transfer Objects
â âââ Note # Immutable Read DTO
â âââ NoteForm # Mutable Form DTO
âââ jpa/ # đž Data Access Layer
âââ entities/ # JPA Entity Classes
â âââ NoteEntity # Datenbankentität mit Mapping
âââ repositories/ # Data Repository Interfaces
âââ NoteRepository # Spring Data JPA Repository
HTTP Request â Controller â Service â Repository â Database
â
Form/DTO â Mapper â Entity â JPA/Hibernate
// JPA Entity (interne Datenrepräsentation)
@Entity
@Table(name = "notes")
public class NoteEntity {
@Id
private UUID id;
@CreationTimestamp
private LocalDateTime createdAt;
// ...
}
// DTO (externe API-Repräsentation)
@Value
@Builder
public class Note {
UUID id;
String content;
LocalDateTime createdAt;
// Keine JPA Annotations!
}
@Mapper(componentModel = "spring")
public interface NoteMapper {
Note entityToDto(NoteEntity entity);
@Mapping(target = "id", ignore = true)
@Mapping(target = "createdAt", ignore = true)
NoteEntity dtoToEntity(Note dto);
}
@Service
@Transactional(readOnly = true)
public class NoteService {
@Transactional // Schreibtransaktion
public Note saveNote(Note note) {
// Geschäftslogik hier
}
}
@Repository
public interface NoteRepository extends JpaRepository<NoteEntity, UUID> {
@Query("SELECT n FROM NoteEntity n ORDER BY n.createdAt DESC")
Stream<NoteEntity> streamAllNotes();
}
mvn test
mvn test -Dspring.profiles.active=test
mvn jacoco:report
# Report verfĂźgbar unter: target/site/jacoco/index.html
- CRUD Operationen verstehen - Analysiere die vollständigen Create/Read/Update/Delete Workflows
- Mapping-Layer erkunden - Untersuche, wie MapStruct Entity-DTO Transformationen durchfĂźhrt
- Transaction-Management - Verstehe
@Transactional
Annotations und ihre Auswirkungen
- Neue Entität hinzufßgen - Erstelle eine
Category
Entität mit Beziehung zuNote
- Validierung implementieren - FĂźge Bean Validation fĂźr Eingabedaten hinzu
- Suchoption einbauen - Implementiere Textsuche in Notizen
- Pagination hinzufĂźgen - Erweitere die Liste um Seitennummerierung
- Many-to-Many Beziehungen - Implementiere Tags fĂźr Notizen
- Optimistic Locking - FĂźge Versionskontrolle fĂźr gleichzeitige Bearbeitung hinzu
- Custom Queries - Erstelle komplexe JPQL/Native Queries
- Caching Strategy - Implementiere Second-Level Caching mit Hibernate
Datei | Zweck | Lernfokus |
---|---|---|
NoteEntity.java |
JPA Entity Definition | Datenbankmapping, Annotations |
NoteRepository.java |
Data Access Layer | Spring Data JPA, Query Methods |
NoteService.java |
Business Logic | Transaction Management, Service Pattern |
NoteMapper.java |
Object Mapping | MapStruct, Type Safety |
NoteController.java |
Web Layer | Spring MVC, HTTP Handling |
application.yaml |
Konfiguration | Spring Boot Properties |
V1.0__initial.sql |
Datenbankschema | Flyway Migration, DDL |
Das Projekt nutzt Docker Compose fĂźr eine konsistente Entwicklungsumgebung:
# docker-compose.db.yaml
services:
postgres:
image: postgres:17
environment:
POSTGRES_DB: transferdemo
POSTGRES_USER: transferdemo
POSTGRES_PASSWORD: transferdemo
ports:
- "5432:5432"
# Datenbank starten
docker-compose -f docker-compose.db.yaml up -d
# Logs anzeigen
docker-compose -f docker-compose.db.yaml logs -f
# Datenbank stoppen
docker-compose -f docker-compose.db.yaml down
# Datenbank zurĂźcksetzen
docker-compose -f docker-compose.db.yaml down -v
Dieses Projekt dient Bildungszwecken. Verbesserungsvorschläge und Erweiterungen sind willkommen:
- Fork des Repositories erstellen
- Feature Branch erstellen (
git checkout -b feature/new-feature
) - Ănderungen committen (
git commit -am 'Add new feature'
) - Branch pushen (
git push origin feature/new-feature
) - Pull Request erstellen
Dieses Projekt steht unter der MIT-Lizenz und dient ausschliesslich Bildungszwecken im Rahmen des Kurses "Relationale Datenbanken" der HĂśheren Fachschule fĂźr Technik Mittelland.