Ein Entity Manager ist ein zentraler Bestandteil von ORM-Frameworks (Object-Relational Mapping), vor allem im Zusammenhang mit Java (JPA – Java Persistence API), aber auch in anderen Sprachen wie PHP (Doctrine ORM).
Hier ist eine verständliche Erklärung:
Ein Entity Manager ist eine Komponente, die sich um die Verwaltung von Datenbank-Entities (also Objekten/Datensätzen) kümmert. Er bildet die Schnittstelle zwischen der objektorientierten Welt des Codes und der relationalen Welt der Datenbank.
Persistieren (Speichern):
Finden/Laden:
Holt ein Objekt anhand seiner ID oder anderer Kriterien.
Beispiel: $entityManager->find(User::class, 1);
Aktualisieren:
Änderungen an einem Objekt werden verfolgt und in die Datenbank geschrieben (z. B. beim flush()
).
Entfernen/Löschen:
Löscht ein Objekt aus der Datenbank.
Beispiel: $entityManager->remove($user);
Transaktionen verwalten:
Beginnt, commitet oder rollt Transaktionen zurück.
Query-Handling:
Führt eigene Abfragen aus, oft mit DQL (Doctrine Query Language) oder JPQL.
Der Entity Manager verwaltet den „Zustand“ von Objekten:
managed (verfolgt Änderungen),
detached (nicht mehr verwaltet),
removed (zum Löschen markiert),
new (noch nicht gespeichert).
$user = new User();
$user->setName('Max Mustermann');
$entityManager->persist($user); // Zum Speichern vormerken
$entityManager->flush(); // Tatsächlich in DB schreiben
Der Entity Manager ist der zentrale Ansprechpartner, wenn es darum geht, mit Datenbankobjekten zu arbeiten – lesen, schreiben, ändern, löschen. Er abstrahiert die SQL-Ebene und macht die Datenbankarbeit objektorientiert steuerbar.
Aspect-Oriented Programming (AOP) ist ein Programmierparadigma, das sich darauf konzentriert, Querschnittsfunktionen (Cross-Cutting Concerns) modular zu kapseln. Es ergänzt objektorientierte oder funktionale Programmierung, indem es Code, der sich durch viele Klassen oder Module zieht, auslagert und separat behandelt.
Probleme wie Logging, Sicherheitsprüfungen, Fehlerbehandlung, Transaktionsmanagement oder Performance-Messungen sind typische Cross-Cutting Concerns. Diese wiederholen sich oft in vielen Klassen und Methoden – AOP ermöglicht es, solchen Code zentral zu schreiben und automatisch an den richtigen Stellen auszuführen.
Aspect: Ein Modul, das eine Querschnittsfunktion kapselt.
Advice: Der eigentliche Code, der ausgeführt wird (z. B. vor, nach oder anstatt einer Methode).
Join Point: Ein Punkt im Programmablauf, an dem ein Aspect eingreifen kann (z. B. Methodenaufruf).
Pointcut: Eine Definition, welche Join Points betroffen sind (z. B. "alle Methoden in Klasse X").
Weaving: Der Prozess, bei dem Aspect-Code mit dem eigentlichen Code „verwoben“ wird – zur Laufzeit, beim Kompilieren oder beim Laden.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Methode wird aufgerufen: " + joinPoint.getSignature().getName());
}
}
Dieser Code führt automatisch Logging aus, bevor jede Methode im com.example.service
-Paket ausgeführt wird.
Bessere Modularität
Weniger Code-Duplikate
Trennung von Fachlogik und Querschnittslogik
Kann die Lesbarkeit erschweren (man sieht nicht sofort, was alles beim Methodenaufruf passiert).
Debugging kann komplexer sein.
Oft framework-abhängig (z. B. Spring, AspectJ).
Design by Contract (DbC) ist ein Konzept aus der Softwareentwicklung, das von Bertrand Meyer eingeführt wurde. Es beschreibt eine Methode zur Sicherstellung der Korrektheit und Zuverlässigkeit von Software, indem Verträge zwischen den verschiedenen Komponenten (z.B. Methoden, Klassen) definiert werden.
Bei DbC wird jede Software-Komponente wie eine Vertragspartei gesehen, die bestimmte Verpflichtungen und Garantien einhält:
Vorbedingungen (Preconditions)
Bedingungen, die erfüllt sein müssen, bevor eine Methode oder Funktion korrekt ausgeführt werden kann.
→ Verantwortung des Aufrufers.
Nachbedingungen (Postconditions)
Bedingungen, die nach der Ausführung garantiert werden.
→ Verantwortung der Methode/Funktion.
Invariant (Klasseninvariante)
Bedingungen, die während der gesamten Lebenszeit eines Objekts wahr bleiben müssen.
→ Verantwortung sowohl der Methode als auch des Aufrufers.
Klare Spezifikation der Verantwortlichkeiten.
Robustere und besser testbare Software.
Fehler werden frühzeitig erkannt (z.B. durch Verletzung des Vertrags).
class BankAccount {
private double balance;
// Invariante: balance >= 0
void withdraw(double amount) {
// Vorbedingung: amount > 0 && amount <= balance
if (amount <= 0 || amount > balance) throw new IllegalArgumentException();
balance -= amount;
// Nachbedingung: balance wurde um amount verringert
}
}
Klare Verträge führen zu weniger Missverständnissen.
Bessere Fehlersuche, da Verstöße gegen Verträge sofort auffallen.
Unterstützt die defensive Programmierung.
Erhöhter Aufwand in der Spezifikation.
Nicht von allen Programmiersprachen direkt unterstützt (z.B. Java, C++ über Assertions, Python mit Decorators; Eiffel unterstützt DbC nativ).
Eine Materialized View (auf Deutsch: „materialisierte Sicht“) ist ein spezielles Datenbankobjekt, das das Ergebnis einer SQL-Abfrage dauerhaft speichert – im Gegensatz zu einer normalen View, die bei jeder Abfrage dynamisch berechnet wird.
Speicherung auf Festplatte: Die Daten der Abfrage werden tatsächlich gespeichert, nicht nur die Abfrage selbst.
Schnellere Abfragen: Da die Daten bereits berechnet und gespeichert sind, können Anfragen deutlich schneller beantwortet werden.
Aktualisierung notwendig: Da sich die zugrundeliegenden Daten ändern können, muss die Materialized View explizit oder automatisch aktualisiert (refreshed) werden, um aktuell zu bleiben.
Merkmal | View | Materialized View |
---|---|---|
Speicherung | Nur Abfrage, keine Daten | Abfrage und Daten gespeichert |
Performance | Langsamer bei komplexen Abfragen | Schneller, da Daten vorgerechnet |
Aktualität | Immer aktuell | Kann veraltet sein |
Aktualisierung notwendig | Nein | Ja (manuell oder automatisch) |
-- Erstellen einer Materialized View in PostgreSQL
CREATE MATERIALIZED VIEW top_customers AS
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id;
Um die Daten zu aktualisieren:
REFRESH MATERIALIZED VIEW top_customers;
Bei komplexen Aggregationen, die häufig gebraucht werden
Wenn Performance wichtiger ist als Echtzeit-Aktualität
In Data Warehouses oder Reporting-Systemen
Ein Partial Mock (teilweises Mocking) ist eine Technik beim Testen von Software, bei der nur ein Teil eines Objekts durch ein Mock ersetzt wird, während der Rest der echten Implementierung erhalten bleibt. Dies ist besonders nützlich, wenn du nur bestimmte Methoden eines Objekts stubben oder mocken möchtest, während andere Methoden normal ausgeführt werden.
Wenn du eine Klasse testen möchtest, aber bestimmte Methoden von ihr isolieren musst.
Wenn einige Methoden schwer zu testen sind (z. B. weil sie externe Abhängigkeiten haben), aber andere weiterhin mit ihrer echten Logik arbeiten sollen.
Wenn du nur einige Methoden stubben möchtest, um den Testablauf zu steuern.
Angenommen, du hast eine Klasse Calculator
, aber möchtest die Methode multiply()
mocken, während add()
normal funktioniert.
class Calculator {
public function add($a, $b) {
return $a + $b;
}
public function multiply($a, $b) {
return $a * $b;
}
}
// PHPUnit Test mit Partial Mock
class CalculatorTest extends \PHPUnit\Framework\TestCase {
public function testPartialMock() {
// Partial Mock von Calculator
$calculator = $this->getMockBuilder(Calculator::class)
->onlyMethods(['multiply']) // Nur diese Methode mocken
->getMock();
// Definiere Verhalten für multiply()
$calculator->method('multiply')->willReturn(10);
// Teste echte Methode add()
$this->assertEquals(5, $calculator->add(2, 3));
// Teste gemockte Methode multiply()
$this->assertEquals(10, $calculator->multiply(2, 3));
}
}
Hier bleibt add()
unverändert und arbeitet mit der echten Implementierung, während multiply()
immer 10
zurückgibt.
Partial Mocks sind nützlich, wenn du Teile einer Klasse isolieren möchtest, ohne sie vollständig zu ersetzen. Sie helfen, Tests stabiler und effizienter zu machen, indem nur bestimmte Methoden gemockt werden.
Ein objektorientiertes Datenbanksystem (OODBMS) ist ein Datenbanksystem, das die Prinzipien der objektorientierten Programmierung (OOP) mit den Funktionalitäten einer Datenbank kombiniert. Es ermöglicht das Speichern, Abrufen und Verwalten von Daten in Form von Objekten, wie sie in objektorientierten Programmiersprachen (z. B. Java, Python oder C++) definiert werden.
Objektmodell:
Klassen und Vererbung:
Kapselung:
Persistenz:
Identität:
Komplexe Datentypen:
Objektorientierte Datenbanken sind besonders nützlich, wenn es darum geht, mit komplexen, hierarchischen oder verschachtelten Datenstrukturen zu arbeiten, wie sie in vielen modernen Softwareprojekten vorkommen.
Object Query Language (OQL) ist eine Abfragesprache, die ähnlich wie SQL (Structured Query Language) funktioniert, aber speziell für objektorientierte Datenbanken entwickelt wurde. Sie wird verwendet, um Daten aus objektorientierten Datenbanksystemen (OODBs) abzufragen, die Daten als Objekte speichern. OQL wurde als Teil des Object Data Management Group (ODMG)-Standards definiert.
Objektorientierte Ausrichtung:
Ähnlichkeit mit SQL:
Abfragen von komplexen Objekten:
Unterstützung für Methoden:
Kompatibilität mit objektorientierten Programmiersprachen:
Angenommen, es gibt eine Datenbank mit einer Klasse Person
mit den Attributen Name
und Age
. Eine OQL-Abfrage könnte wie folgt aussehen:
SELECT p.Name
FROM Person p
WHERE p.Age > 30
Diese Abfrage gibt die Namen aller Personen zurück, deren Alter größer als 30 ist.
In der Praxis ist OQL weniger populär als SQL, da relationale Datenbanken nach wie vor weit verbreitet sind. Allerdings ist OQL in spezialisierten Anwendungen, die objektorientierte Datenmodelle nutzen, sehr leistungsfähig.
Dynamic HTML (DHTML) ist eine Kombination von Technologien, die verwendet wird, um interaktive und dynamische Webinhalte zu erstellen. Es ist kein eigenständiger Standard oder eine Programmiersprache, sondern eine Sammlung von Techniken und Tools, die zusammenarbeiten. Mit DHTML können Websites dynamisch und interaktiv gestaltet werden, ohne dass die gesamte Seite neu geladen werden muss.
HTML (Hypertext Markup Language)
Die Grundstruktur der Website.
CSS (Cascading Style Sheets)
Steuert das Aussehen und das Layout der Webseite. Mit CSS können Stile dynamisch verändert werden, z. B. durch Hover-Effekte oder das Ändern von Farben und Positionen.
JavaScript
Ermöglicht das Hinzufügen von Interaktivität und dynamischem Verhalten, wie das Aktualisieren von Inhalten, ohne die Seite neu zu laden.
DOM (Document Object Model)
Eine Programmierschnittstelle, die den Zugriff auf und die Manipulation der Struktur der Webseite ermöglicht. JavaScript interagiert mit dem DOM, um Inhalte zu ändern oder neue Elemente hinzuzufügen.
Ein einfaches Beispiel wäre ein Button, der beim Anklicken den Text auf der Seite ändert.
<!DOCTYPE html>
<html>
<head>
<style>
#text {
color: blue;
font-size: 20px;
}
</style>
<script>
function changeText() {
document.getElementById("text").innerHTML = "Text geändert!";
document.getElementById("text").style.color = "red";
}
</script>
</head>
<body>
<p id="text">Originaler Text</p>
<button onclick="changeText()">Klicke mich</button>
</body>
</html>
Heutzutage hat DHTML durch modernere Techniken wie AJAX und Frameworks (z. B. React, Vue.js) an Bedeutung verloren, war jedoch ein wichtiger Schritt in der Entwicklung interaktiver Webanwendungen.
Die Data Definition Language (DDL) ist ein Bestandteil von SQL (Structured Query Language) und umfasst Befehle, die zur Definition und Verwaltung der Struktur einer Datenbank verwendet werden. DDL-Befehle ändern die Metadaten einer Datenbank, also Informationen über Tabellen, Indizes, Schemata und andere Datenbankobjekte, anstatt die eigentlichen Daten zu manipulieren.
1. CREATE
Wird verwendet, um neue Datenbankobjekte wie Tabellen, Schemata, Views oder Indizes zu erstellen.
Beispiel:
CREATE TABLE Kunden (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Alter INT
);
2. ALTER
Dient zur Änderung der Struktur von existierenden Objekten, z. B. Hinzufügen oder Entfernen von Spalten.
Beispiel:
ALTER TABLE Kunden ADD Email VARCHAR(100);
3. DROP
Entfernt ein Datenbankobjekt (z. B. eine Tabelle) dauerhaft.
Beispiel:
DROP TABLE Kunden;
4. TRUNCATE
Löscht alle Daten aus einer Tabelle, behält jedoch die Struktur der Tabelle bei. Es ist schneller als ein DELETE
, da keine Transaktionsprotokolle erstellt werden.
Beispiel:
TRUNCATE TABLE Kunden;
DDL ist essenziell für das Design und die Verwaltung einer Datenbank und wird meist zu Beginn eines Projekts oder bei strukturellen Änderungen verwendet.
Das Document Object Model (DOM) ist eine standardisierte Schnittstelle, die von Webbrowsern bereitgestellt wird, um strukturierte Dokumente – insbesondere HTML- und XML-Dokumente – darzustellen und programmatisch zu manipulieren. Es beschreibt die hierarchische Struktur eines Dokuments als Baum, wobei jeder Knoten ein Element, Attribut oder einen Text darstellt.
Baumstruktur:
<html>
-Element, mit untergeordneten Knoten wie <head>
, <body>
, <div>
, <p>
usw.Objektorientierte Darstellung:
Interaktivität:
<p>
-Elements ändern oder ein <div>
-Element einfügen.Plattform- und Programmiersprachenunabhängig:
1. Zugriff auf ein Element:
let element = document.getElementById("meinElement");
2. Ändern des Inhalts:
element.textContent = "Neuer Text";
3. Hinzufügen eines neuen Elements:
let neuerKnoten = document.createElement("div");
document.body.appendChild(neuerKnoten);
Das DOM wird durch Standards des W3C (World Wide Web Consortium) definiert und ständig weiterentwickelt, um moderne Webtechnologien zu unterstützen.