https://github.com/habsgleich/orbit
Orbit đđ§âđ - Ein modernes, typsicheres und intuitives Fluent-Style ORM fĂŒr Java, das die LeistungsfĂ€higkeit von SQL mit der Einfachheit einer Fluent-API kombiniert. Entwickelt fĂŒr maximale Lesbarkeit, Performance und Entwicklerfreundlichkeit.
https://github.com/habsgleich/orbit
fluent-design java orm postgresql
Last synced: 2 months ago
JSON representation
Orbit đđ§âđ - Ein modernes, typsicheres und intuitives Fluent-Style ORM fĂŒr Java, das die LeistungsfĂ€higkeit von SQL mit der Einfachheit einer Fluent-API kombiniert. Entwickelt fĂŒr maximale Lesbarkeit, Performance und Entwicklerfreundlichkeit.
- Host: GitHub
- URL: https://github.com/habsgleich/orbit
- Owner: HabsGleich
- License: apache-2.0
- Created: 2025-03-26T13:13:49.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-27T00:18:10.000Z (over 1 year ago)
- Last Synced: 2025-03-27T01:26:28.189Z (over 1 year ago)
- Topics: fluent-design, java, orm, postgresql
- Language: Java
- Homepage:
- Size: 74.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Orbit
Eine fluent-style Java ORM-Bibliothek fĂŒr typsichere und elegante Datenbankoperationen, basierend auf [Hibernate](https://github.com/hibernate).




## Ăbersicht
Orbit ist ein modernes Java ORM-Framework, das eine intuitive und typsichere API fĂŒr Datenbankoperationen bietet. Es wurde entwickelt, um die KomplexitĂ€t von SQL-Abfragen zu reduzieren und gleichzeitig volle Kontrolle ĂŒber die generierten Abfragen zu behalten.
```java
// Beispiel einer Orbit-Abfrage
Optional customer = Repository.of(Customer.class)
.query()
.equal("firstName", "John")
.findOne();
```
## Features
- **Fluent API**: Intuitive Methodenverkettung fĂŒr natĂŒrliche Lesbarkeit
- **Typsicherheit**: Kompilierzeitvalidierung von Abfragen und EntitÀten
- **Repository-Pattern**: Klares und einfaches Design fĂŒr Datenzugriffslogik
- **Benutzerdefinierte Abfragen**: Flexible `CustomQuery`-Schnittstelle fĂŒr komplexe Szenarien
- **Transaktionskontrolle**: Einfache Verwaltung von Datenbanktransaktionen mit `OrbitTransaction`
- **Hibernate-Integration**: Nutzt die LeistungsfÀhigkeit von Hibernate mit einer vereinfachten API
- **Minimaler Boilerplate**: Generiere weniger Code fĂŒr hĂ€ufige Operationen
- **Einfache Konfiguration**: Schneller Einstieg mit unkomplizierter Einrichtung
- **Testfreundlich**: In-Memory-Datenbank-Integration fĂŒr Tests
## Installation
### Gradle (Kotlin DSL)
```kotlin
dependencies {
implementation("dev.habsgleich:orbit:")
}
```
### Maven
```xml
dev.habsgleich
orbit
1.0.0
```
## Schnellstart
### 1. EntitÀten definieren
Erstelle deine EntitÀtsklassen mit den entsprechenden JPA-Annotationen:
```java
@Entity(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
private String firstName;
private String lastName;
@Column(unique = true, nullable = false)
private String email;
private String phone;
private String password;
// Getters und Setters oder verwende Lombok fĂŒr weniger Boilerplate-Code
// Optional: Builder-Pattern
public static CustomerBuilder builder() {
return new CustomerBuilder();
}
}
```
Wichtige Annotationen fĂŒr EntitĂ€ten:
- `@Entity`: Markiert die Klasse als JPA-EntitĂ€t (mit optionalem Namen fĂŒr die Tabelle)
- `@Id`: Definiert den PrimĂ€rschlĂŒssel
- `@GeneratedValue`: Konfiguriert die automatische ID-Generierung
- `@Column`: Passt die Spalteneigenschaften an (z.B. unique, nullable, length)
- `@Table`: Erlaubt weitere Tabellenkonfiguration (falls nötig)
- `@OneToMany`, `@ManyToOne`, etc.: Definiert Beziehungen zu anderen EntitÀten
### 2. Orbit initialisieren
Orbit bietet mehrere Möglichkeiten zur Initialisierung:
#### Mit Properties-Datei als InputStream
```java
// Initialisiere Orbit mit Konfigurationsdatei und EntitÀtsklassen
Orbit.initialize(
YourApp.class.getResourceAsStream("/orbit.properties"),
Customer.class
);
```
#### Mit Properties-Objekt
```java
// Eigenschaften direkt als Properties-Objekt
Properties props = new Properties();
props.setProperty("hibernate.hikari.dataSource.url", "jdbc:postgresql://localhost:5432/mydb");
props.setProperty("hibernate.hikari.dataSource.user", "user");
props.setProperty("hibernate.hikari.dataSource.password", "password");
Orbit.initialize(props, Customer.class);
```
#### Mit direkten Verbindungsparametern
```java
// Einfache Initialisierung mit Verbindungsparametern
Orbit.initialize(
"jdbc:postgresql://localhost:5432/mydb",
"user",
"password",
Customer.class
);
```
### 3. Repository erstellen und nutzen
```java
// Repository fĂŒr spezifische EntitĂ€t erstellen
Repository repository = Repository.of(Customer.class);
// Neue EntitÀt speichern
Customer customer = repository.merge(
Customer.builder()
.firstName("John")
.lastName("Doe")
.email("email@email.com")
.password("encryptedPassword")
.phone("1234567890")
.build()
);
// EntitÀt nach Kriterien abfragen
Optional foundCustomer = repository.query()
.equal("firstName", "John")
.findOne();
// Alle EntitÀten abrufen
List allCustomers = repository.query().findAll();
// EntitÀt löschen
repository.delete(customer);
```
## Abfragen
### Einfache Abfragen
```java
// Eine EntitÀt finden
Optional customer = repository.query()
.equal("email", "test@example.com")
.findOne();
// Mehrere EntitÀten finden
List customers = repository.query()
.like("lastName", "Smith")
.findAll();
```
### Komplexe Abfragen
```java
List customers = repository.query()
.equal("active", true)
.or(q -> q
.notEqual("status", "INACTIVE")
.greaterThan("lastLogin", LocalDate.now().minusDays(30))
)
.orderBy("lastName", true)
.limit(20)
.findAll();
```
### Benutzerdefinierte Abfragen mit CustomQuery
FĂŒr komplexe Szenarien kannst du mit `CustomQuery` eigene Kriterien definieren:
```java
// CustomQuery funktionales Interface
Optional vipCustomer = repository.query()
.custom((criteriaBuilder, root) ->
criteriaBuilder.and(
criteriaBuilder.equal(root.get("status"), "VIP"),
criteriaBuilder.greaterThan(root.get("totalPurchases"), 10000)
)
)
.findOne();
// Kombiniere Standard-API mit benutzerdefinierten Abfragen
List recentActiveVIPs = repository.query()
.equal("active", true)
.custom((cb, root) ->
cb.greaterThan(root.get("lastPurchaseDate"), LocalDate.now().minusDays(30))
)
.orderBy("totalPurchases", false) // absteigend
.findAll();
```
## Benutzerdefinierte Transaktionen
Orbit ermöglicht dir, komplexe Transaktionen mit vollstĂ€ndiger Kontrolle ĂŒber die Session und Transaktionsverwaltung auszufĂŒhren:
```java
// Benutzerdefinierte Transaktion mit dem OrbitTransaction-Interface
Customer result = repository.transactional((session, transaction) -> {
// FĂŒhre mehrere Datenbankoperationen innerhalb einer Transaktion aus
Customer customer = session.get(Customer.class, 1L);
customer.setStatus("PREMIUM");
Order newOrder = new Order();
newOrder.setCustomer(customer);
newOrder.setAmount(199.99);
session.save(newOrder);
// Die Transaktion wird automatisch committed und die Session geschlossen
return customer;
});
// Fehlerbehandlung erfolgt automatisch mit Rollback
try {
repository.transactional((session, transaction) -> {
// Fehlerhafte Operation
throw new RuntimeException("Etwas ist schiefgelaufen");
});
} catch (RuntimeException e) {
// Transaktion wurde automatisch zurĂŒckgerollt
System.out.println("Transaktion wurde zurĂŒckgerollt: " + e.getMessage());
}
```
## Konfiguration
Erstelle eine `orbit.properties` Datei im Ressourcen-Verzeichnis:
```properties
# Datenbankverbindung mit Hibernate/HikariCP
hibernate.hikari.dataSource.url=jdbc:postgresql://localhost:5432/mydb
hibernate.hikari.dataSource.user=user
hibernate.hikari.dataSource.password=password
# Optionale Hibernate-Konfigurationen
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
```
### Zugriff auf die SessionFactory
Nachdem Orbit initialisiert wurde, kannst du bei Bedarf auf die Hibernate-SessionFactory zugreifen:
```java
// Nach der Initialisierung
SessionFactory sessionFactory = Orbit.instance().sessionFactory();
```
## Mitwirken
BeitrÀge sind willkommen! Bitte lies zuerst unsere [Beitragsrichtlinien](CONTRIBUTING.md).
## Lizenz
Dieses Projekt steht unter der MIT License - siehe die [LICENSE](LICENSE) Datei fĂŒr Details.
## Dank
- Dank an alle Mitwirkenden und Benutzer, die Feedback geben
- Basiert auf [Hibernate](https://github.com/hibernate), einem der leistungsstĂ€rksten ORM-Frameworks fĂŒr Java