[JAVA] Datenkern beginnend mit Gradle

Einführung

Dies ist der Artikel zum 11. Tag von Java Advent Calendar 2016.

Alles begann, als ich ein Gradle-Skifahrer war und Google Cloud SQL mit Google Container Engine auf Gradle verwenden wollte. Danach habe ich einige Wände getroffen und beschlossen, ein wenig davon zu schreiben, einschließlich der Bedeutung eines Memorandums.

Google Cloud SQL ist eine Funktion von Google Cloud Platfrom und eine MySQL-kompatible Datenbank. Google Container Engine ist auch eine Funktion der Google Cloud Platform, einfach ein Docker-Host. Es gibt viele Missverständnisse. Weitere Informationen finden Sie in diesem Bereich unter Fachleuten, Fachbüchern und Fachseiten.

Was ist JDO und Data Nucleus?

Um JDO kurz zu erklären, handelt es sich um einen Mechanismus, mit dem Java-Klassen unverändert in der Datenbank gespeichert werden können. Bei Verwendung von JDO scheint das Halten des Status einer Klasse als Persistenz ausgedrückt zu werden. In diesem Artikel lasse ich die Struktur beiseite und stelle sie zuerst zur Verfügung.

DataNucleus ist eine Implementierung von JPA und JDO und wird auch häufig in Google App Engine verwendet. Wenn Sie im Web nach DataNucleus suchen, finden Sie daher viele Artikel über AppEngine, die etwas verwirrend sein können. Die offizielle Seite ist hier. http://www.datanucleus.org/

In diesem Artikel möchte ich Data Nucleus 5.0.3 vorstellen, das dem neuesten einen Schritt voraus ist.

Gradle-Projekt

Jetzt möchte ich ein Gradle-Projekt erstellen. Ich kann nicht gut erklären, deshalb würde ich gerne im Code sprechen.

build.gradle


buildscript {
  repositories {
    jcenter()
  }
}

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'net.leak4mk0.test.datanucleus.Main'

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

repositories {
    jcenter()
}

dependencies {
  // JDO
  compile 'org.datanucleus:datanucleus-core:5.0.3'
  compile 'org.datanucleus:datanucleus-api-jdo:5.0.3'
  compile 'org.datanucleus:datanucleus-rdbms:5.0.3'
  compile 'org.datanucleus:javax.jdo:3.2.0-m5'

  // DB
  compile 'com.h2database:h2:1.4.193'
}

Beachten Sie, dass wir anstelle von javax.jdo: jdo-api: * als JDO-Schnittstelle den von DataNucleus bereitgestellten org.datanucleus: javax.jdo: * verwenden. .. Bei früheren Versionen von DataNucleus scheint es kein Problem zu geben, aber es scheint besser, die DataNucleus-Schnittstelle in der 5.x.x-Serie zu verwenden.

Außerdem benötigen Sie natürlich einen DB-Connector. Dieses Mal übernehmen wir H2 für die Datenbank. Fügen Sie daher den H2-Treiber zur Abhängigkeit hinzu. Wenn Sie nur den Treiber verwenden möchten, können Sie "Laufzeit" verwenden, aber dieses Mal möchte ich die Webkonsole verwenden, also gebe ich "Kompilieren" an.

Importieren Sie die erstellte Gradle-Datei mit Intellij IDEA. Wenn Sie Eclipse verwenden oder keine IDE benötigen, gehen Sie bitte entsprechend vor. (Wurfgefühl) Nebenbei bemerkt ist Gradle bereits v3.1 ... Ich bemerkte es, als ich rechts unten auf IDEA schaute.

JDO-Modell

Als Nächstes möchte ich eine Modellklasse zur Verwendung in JDO erstellen. Hier ist ein Beispiel, aber ich denke, es ist hilfreich, sich andere Seiten über JDO anzusehen (insbesondere die offizielle AppEngine-Dokumentation). Die üblichen Klassen "Autor" und "Buch".

java/net/leak4mk0/test/datanucleus/Author.java


package net.leak4mk0.test.datanucleus;

import java.util.Set;
import javax.jdo.annotations.Element;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable //Klasse zu bestehen
public class Author {
  @PrimaryKey //Primärschlüssel
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) //Generieren Sie automatisch einen eindeutigen Schlüssel
  private Long id;

  @Persistent //Felder bleiben bestehen
  private String name;

  @Persistent(mappedBy = "author")
  @Element(dependent = "true")
  private Set<Book> books;

  public Author(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

java/net/leak4mk0/test/datanucleus/Book.java


package net.leak4mk0.test.datanucleus;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable
public class Book {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Long id;

  @Persistent
  private Author author;

  @Persistent
  private String title;

  public Book(Author author, String title) {
    this.author = author;
    this.title = title;
  }

  public Author getAuthor() {
    return this.author;
  }

  public void setAuthor(Author author) {
    this.author = author;
  }

  public String getTitle() {
    return this.title;
  }

  public void setTitle(String title) {
    this.title = title;
  }
}

Wir werden Anmerkungen verwenden, um anzugeben, wie beibehalten werden soll.

JDO-Konfigurationsdatei

Für den Zugriff von JDO auf die Datenbank sind einige Einstellungen erforderlich. Wir legen fest, was für die JDO-Implementierung, das DB-Verbindungsziel, den Treiber, den Benutzer usw. verwendet werden soll. Weitere Informationen finden Sie auf der folgenden Seite. http://www.datanucleus.org/products/datanucleus/jdo/pmf.html

resources/META-INF/jdoconfig.xml


<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdoconfig">
  <persistence-manager-factory name="memory-h2">
    <property name="javax.jdo.PersistenceManagerFactoryClass"
        value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>
    <property name="javax.jdo.option.ConnectionURL" value="jdbc:h2:mem:test"/>
    <property name="javax.jdo.option.ConnectionDriverName" value="org.h2.Driver"/>
    <property name="javax.jdo.option.ConnectionUserName" value="sa"/>
    <property name="javax.jdo.option.ConnectionPassword" value=""/>
    <property name="datanucleus.schema.autoCreateTable" value="true"/>
  </persistence-manager-factory>
</jdoconfig>

Es ist auch möglich, mehrere Einstellungen zu beschreiben, z. B. das Ändern der während der Entwicklung und des Betriebs verwendeten Datenbank. Dies kann durch Schreiben mehrerer "Persistence-Manager-Factory" -Elemente mit unterschiedlichen "Name" -Attributen erfolgen.

Haupt code

Und der Hauptcode. Sie werden wahrscheinlich keine Multi-Byte-Variablennamen in Ihrem tatsächlichen Code verwenden, aber es kann nützlich sein, wenn Sie Beispielcode schreiben. Code-Vervollständigung ist schwer zu arbeiten, aber ...

java/net/leak4mk0/test/datanucleus/Main.java


package net.leak4mk0.test.datanucleus;

import java.sql.SQLException;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import org.h2.tools.Server;

public class Main {
  public static void main(String[] args) throws SQLException {
    final PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("memory-h2");
    final PersistenceManager pm = pmf.getPersistenceManager();

Endautor Ryunosuke Akutagawa= new Author("Ryunosuke Akutagawa");
Endautor Satoshi Fukuzawa= new Author("Satoshi Fukuzawa");
Endautor Osamu Osamu= new Author("Osamu Dazai");
    pm.makePersistentAll(Satoshi Fukuzawa,Osamu Dazai); //Beharrlichkeit

letztes Buch Rashomon= new Book(Ryunosuke Akutagawa, "Rashomon");
    pm.makePersistentAll(Rashomon); //Beharrlichkeit

letztes Buch Westliche Angelegenheiten= new Book(Satoshi Fukuzawa, "Westliche Angelegenheiten");
endgültige akademische Empfehlungen des Buches= new Book(Satoshi Fukuzawa, "Akademische Empfehlungen");
    pm.makePersistentAll(Westliche Angelegenheiten,Akademische Empfehlungen); //Beharrlichkeit

letztes Buch 100 Ansichten von Tomitake= new Book(Osamu Dazai, "Tomitake Hyakukei");
letztes Buch Run Meros= new Book(Osamu Dazai, "Führen Sie meros aus");
letztes Buch Tsugaru= new Book(Osamu Dazai, "Tsugaru");
    pm.makePersistentAll(Tomitake Hyakukei,Führen Sie meros aus,Tsugaru); //Beharrlichkeit

    pm.deletePersistentAll(Rashomon); //Löschen

Akademische Empfehlungen.author =Osamu Dazai; //Veränderung

    Server.main(); //Starten Sie die Konsole
  }
}

Grundsätzlich "makePersistent", um die Daten beizubehalten, und "deletePersistent", um sie zu löschen. Wenn Sie die Daten ändern möchten, sobald sie beibehalten wurden, ändern Sie einfach das Feld. Ich habe es diesmal nicht gepostet, aber bei der Suche verwende ich die Methoden newQuery und executeList.

Noch ein Schritt, Verbesserung

Schließlich gibt es noch einen Job. Wie Sie sehen können, erfordert die Verwendung von JDO zum Fortbestehen eines Modells sehr einfachen Code, da DataNucleus jeder Klasse den Code hinzufügt, den Sie wirklich benötigen. Das Hinzufügen von Code unter Bezugnahme auf die Anmerkungsinformationen wird als "Erweitern" bezeichnet. Um die Modellklasse dauerhaft zu erhalten, muss der Enhancer die Modellklasse nach der Kompilierung erweitern. Details zur Bedienung von Enhancer finden Sie auf der folgenden Seite. http://www.datanucleus.org/products/datanucleus/jdo/enhancer.html

Das Schreiben in Gradle ist der Hauptpunkt dieses Artikels. (Es war lang…) Ich werde es schnell unter Bezugnahme auf die Beschreibungsmethode in Ant schreiben.

build.gradle


//Unterlassung...
task enhance {
  description = 'DataNucleus enhancement'
  dependsOn compileJava

  doLast {
    ant.taskdef(
            name: 'datanucleusenhancer',
            classpath: sourceSets.main.runtimeClasspath.asPath,
            classname: 'org.datanucleus.enhancer.EnhancerTask'
    )

    ant.datanucleusenhancer(
            classpath: sourceSets.main.runtimeClasspath.asPath,
            failonerror: true,
            verbose: true,
            api: 'JDO') {
      fileset(dir: sourceSets.main.output.classesDir)
    }
  }
}
classes.dependsOn enhance

Da eine Klassendatei verwendet wird, muss sie nach der Task "compileJava" ausgeführt werden, und "abhängige" gibt an, dass sie von "compileJava" abhängt. Es stützt sich auch auf die Aufgabe "Erweitern" für die Aufgabe "Klassen", um sicherzustellen, dass sie vor der Ausführung erweitert wird.

Ausführungsergebnis

Danach sollte "gradlew run" den Browser starten und den Inhalt der Datenbank überprüfen. Stellen Sie sicher, dass Sie in der JDBC-URL "jdbc: h2: mem: test" angeben.

image Sie können sehen, dass die gesamte im Hauptcode durchgeführte Persistenzverarbeitung angewendet wurde.

schließlich

Dieses Mal war das Wichtigste, wie Data Nucleus mit Gradle verbessert werden kann. Beim tatsächlichen Betrieb mit GCP und beim Hinzufügen von Abhängigkeiten zu Gradle gab es aufgrund von Bibliothekskonflikten usw. einen weiteren Anpassungspunkt. Wenn es offensichtliche Codierungsfehler, aber Ausnahmen gibt, sollten Sie sich den Abhängigkeitsbaum von Gradle einmal ansehen.

Bis zum Ende Danke fürs Lesen. Fühlen Sie sich frei, den in diesem Artikel gezeigten Code zu verwenden. Bitte beachten Sie jedoch, dass wir keine Verantwortung übernehmen können.

Recommended Posts

Datenkern beginnend mit Gradle
Verwenden Sie ProGuard mit Gradle
Integrationstest mit Gradle
Installieren Sie Gradle auf ubuntu16.04
Beginnend mit Swift Swift UI
Verwenden Sie WebJars mit Gradle
Beginnen Sie mit Gradle
Verwenden Sie jlink mit gradle
Erstellen Sie mit Gradle ein Java-Multiprojekt
Gradle + Kotlin-Glas mit DSL generieren
GraphQL Client beginnend mit Ruby
Spring Boot beginnt mit dem Kopieren
Spring Boot beginnend mit Docker
Verwenden Sie log4j2 mit YAML + Gradle
Hallo Welt mit SpringBoot / Gradle
Erstellen eines Java-Projekts mit Gradle
Gradle
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ausgabe Testabdeckung mit Klee + Gradle
Entwickeln Sie die Verarbeitung mit IntelliJ + Kotlin + Gradle
Ein Memorandum beim Start einer Neuentwicklung mit IntelliJ + Gradle + SpringBoot + JUnit5 (Jupiter)
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
Einführung in Java ab 0 Teil 1
AWS Lambda (Lambda) Teil 1 mit Java startet jetzt
Konfigurieren Sie ein Multiprojekt mit Unterverzeichnissen in Gradle
Der JUnit 5-Gradle-Test führt zu einem Fehler mit der Lombok-Annotation
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Laden Sie JDK mit Gradle herunter und erstellen Sie JRE
Fügen Sie der von gradle erstellten Distribution ein Skript hinzu
(IntelliJ + gradle) Hallo Welt mit Spring Boot