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.
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.