Anleitung zu Ebean ORM

Leitfaden für Ebean ORM

1. Einführung

Ebean ist ein in Java geschriebenes objektrelationales Mapping-Tool.

Es unterstützt die Standard-JPA-Annotationen zum Deklarieren von Entitäten. Es bietet jedoch eine viel einfachere API für die Persistenz. Tatsächlich ist einer der Punkte, die in Bezug auf die Ebean-Architektur erwähnenswert sind, dass sie ohne Sitzung ausgeführt wird, was bedeutet, dass Entitäten nicht vollständig verwaltet werden.

Außerdem wird es mit einer Abfrage-API geliefert und unterstützt das Schreiben von Abfragen in nativem SQL. Ebean unterstützt alle wichtigen Datenbankanbieter wie Oracle, Postgres, MySQL, H2 usw.

In diesem Tutorial sehen wir uns an, wie wir mit Ebean und H2 Entitäten erstellen, beibehalten und abfragen können.

2. Konfiguration

Lassen Sie uns zunächst unsere Abhängigkeiten sowie einige grundlegende Konfigurationen abrufen.

2.1. Maven-Abhängigkeiten

Bevor wir beginnen, importieren wir die erforderlichen Abhängigkeiten:


    io.ebean
    ebean
    11.22.4


    com.h2database
    h2
    1.4.196


    ch.qos.logback
    logback-classic
    1.2.3

Die neuesten Versionen vonEbean,H2 undLogback finden Sie in Maven Central.

2.2. Verbesserungen

Ebean muss Entity-Beans so ändern, dass sie vom Server verwaltet werden können. Daher fügen wir ein Maven-Plugin hinzu, um diesen Job zu erledigen:


    io.ebean
    ebean-maven-plugin
    11.11.2
    
        
            main
            process-classes
            
                debug=1
            
            
                enhance
            
        
    

Wir müssen dem Maven-Plugin auch die Namen der Pakete zur Verfügung stellen, die die Entitäten und Klassen enthalten, die Transaktionen verwenden. Dazu erstellen wir die Dateiebean.mf:

entity-packages: com.example.ebean.model
transactional-packages: com.example.ebean.app

2.3. Protokollierung

Erstellen Sie auchlogback.xml und setzen Sie die Protokollierungsstufen für einige Pakete aufTRACE, damit wir die ausgeführten Anweisungen sehen können:



3. Server konfigurieren

Wir müssen eineEbeanServer-Instanz erstellen, um Entitäten zu speichern oder Abfragen in einer Datenbank auszuführen. Es gibt zwei Möglichkeiten, wie Sie eine Serverinstanz erstellen können: mithilfe einer Standardeigenschaftendatei oder programmgesteuert.

3.1. Verwenden einer Standardeigenschaftendatei

Die Standardeigenschaftendatei kann vom Typproperties oderyaml sein. Ebean sucht nach Konfigurationen in Dateien mit den Namenapplication.properties,ebean.properties oderapplication.yml.

Neben der Angabe der Datenbankverbindungsdetails können wir Ebean auch anweisen, DDL-Anweisungen zu erstellen und auszuführen.

Schauen wir uns nun eine Beispielkonfiguration an:

ebean.db.ddl.generate=true
ebean.db.ddl.run=true

datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:customer
datasource.db.databaseDriver=org.h2.Driver

3.2. Verwenden von ServerConfig

Schauen wir uns als nächstes an, wie wir denselben Server programmgesteuert mitEbeanServerFactory undServerConfig erstellen können:

ServerConfig cfg = new ServerConfig();

Properties properties = new Properties();
properties.put("ebean.db.ddl.generate", "true");
properties.put("ebean.db.ddl.run", "true");
properties.put("datasource.db.username", "sa");
properties.put("datasource.db.password", "");
properties.put("datasource.db.databaseUrl","jdbc:h2:mem:app2";
properties.put("datasource.db.databaseDriver", "org.h2.Driver");

cfg.loadFromProperties(properties);
EbeanServer server = EbeanServerFactory.create(cfg);

3.3. Standardserverinstanz

A single EbeanServer instance maps to a single database. Abhängig von unseren Anforderungen können wir auch mehr als eineEbeanServer Instanz erstellen.

Wenn nur eine einzelne Serverinstanz erstellt wird, wird diese standardmäßig als Standardserverinstanz registriert. Es kann überall in der Anwendung mit einer statischen Methode für die KlasseEbeanzugegriffen werden:

EbeanServer server = Ebean.getDefaultServer();

Bei mehreren Datenbanken kann eine der Serverinstanzen als Standardinstanz registriert werden:

cfg.setDefaultServer(true);

4. Entitäten erstellen

Ebean bietet vollständige Unterstützung für JPA-Anmerkungen sowie zusätzliche Funktionen mithilfe eigener Anmerkungen.

Erstellen wir nur wenige Entitäten mit JPA- und Ebean-Annotationen. Zunächst erstellen wirBaseModel, die Eigenschaften enthalten, die für Entitäten: gleich sind

@MappedSuperclass
public abstract class BaseModel {

    @Id
    protected long id;

    @Version
    protected long version;

    @WhenCreated
    protected Instant createdOn;

    @WhenModified
    protected Instant modifiedOn;

    // getters and setters
}

Hier haben wir die JPA-AnnotationMappedSuperClass verwendet, um dieBaseModel. und zwei Ebean-Annotationenio.ebean.annotation.WhenCreated undio.ebean.annotation.WhenModified für Prüfungszwecke zu definieren.

Als nächstes erstellen wir zwei EntitätenCustomer undAddress, dieBaseModel erweitern:

@Entity
public class Customer extends BaseModel {

    public Customer(String name, Address address) {
        super();
        this.name = name;
        this.address = address;
    }

    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    Address address;

    // getters and setters
}
@Entity
public class Address extends BaseModel{

    public Address(String addressLine1, String addressLine2, String city) {
        super();
        this.addressLine1 = addressLine1;
        this.addressLine2 = addressLine2;
        this.city = city;
    }

    private String addressLine1;
    private String addressLine2;
    private String city;

    // getters and setters
}

InCustomer haben wir eine Eins-zu-Eins-Zuordnung mitAddress definiert und den festgelegten Kaskadentyp zuALL hinzugefügt, damit untergeordnete Entitäten zusammen mit den übergeordneten Entitäten aktualisiert werden.

5. Grundlegende CRUD-Operationen

Zuvor haben wir gesehen, wie dieEbeanServerkonfiguriert werden, und zwei Entitäten erstellt. Jetzt istlet’s carry out some basic CRUD operationsauf ihnen.

Wir verwenden die Standardserverinstanz, um die Daten beizubehalten und auf sie zuzugreifen. Die KlasseEbeanbietet auch statische Methoden zum Speichern und Zugreifen auf Daten, die die Anforderung an die Standardserverinstanz weiterleiten:

Address a1 = new Address("5, Wide Street", null, "New York");
Customer c1 = new Customer("John Wide", a1);

EbeanServer server = Ebean.getDefaultServer();
server.save(c1);

c1.setName("Jane Wide");
c1.setAddress(null);
server.save(c1);

Customer foundC1 = Ebean.find(Customer.class, c1.getId());

Ebean.delete(foundC1);

Zuerst erstellen wir einCustomer-Objekt und verwenden die Standardserverinstanz, um es mitsave() zu speichern.

Als Nächstes aktualisieren wir die Kundendaten und speichern sie erneut mitsave().

Schließlich verwenden wir die statische Methodefind() aufEbean, um den Kunden abzurufen und mitdelete() zu löschen.

6. Abfragen

Query APIs can also be used to create an object graph with filters and predicates. Wir können entwederEbean oderEbeanServer verwenden, um Abfragen zu erstellen und auszuführen.

Schauen wir uns eine Abfrage an, die einCustomer nach Stadt findet und einCustomer- undAddress -Objekt zurückgibt, wobei nur einige Felder ausgefüllt sind:

Customer customer = Ebean.find(Customer.class)
            .select("name")
            .fetch("address", "city")
            .where()
            .eq("city", "San Jose")
            .findOne();

Hier geben wir mitfind() an, dass wir Entitäten vom TypCustomer finden möchten. Als Nächstes verwenden wirselect(), um die Eigenschaften anzugeben, die imCustomer-Objekt ausgefüllt werden sollen.

Später verwenden wirfetch(), um anzugeben, dass wir das zuCustomer gehörendeAddress-Objekt abrufen möchten und dass wir dascity-Feld. abrufen möchten

Schließlich fügen wir ein Prädikat hinzu und beschränken die Größe des Ergebnisses auf 1.

7. Transaktionen

Ebean führt standardmäßig jede Anweisung oder Abfrage in einer neuen Transaktion aus.

Obwohl dies in einigen Fällen kein Problem sein kann. Es kann vorkommen, dass wir eine Reihe von Anweisungen innerhalb einer einzelnen Transaktion ausführen möchten.

Wenn wir in solchen Fällen die Methode mitio.ebean.annotations.Transactional, all kommentieren, werden die Anweisungen innerhalb der Methode innerhalb derselben Transaktion ausgeführt:

@Transactional
public static void insertAndDeleteInsideTransaction() {
    Customer c1 = getCustomer();
    EbeanServer server = Ebean.getDefaultServer();
    server.save(c1);
    Customer foundC1 = server.find(Customer.class, c1.getId());
    server.delete(foundC1);
}

8. Das Projekt aufbauen

Zuletzt können wir das Maven-Projekt mit dem folgenden Befehl erstellen:

compile io.ebean:ebean-maven-plugin:enhance

9. Fazit

Zusammenfassend haben wir uns die Grundfunktionen von Ebean angesehen, mit denen Entitäten in einer relationalen Datenbank beibehalten und abgefragt werden können.

Schließlich ist dieser Code fürGithub verfügbar.