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.
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.
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.
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.
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.
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
.
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.
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.
Sie können sehen, dass die gesamte im Hauptcode durchgeführte Persistenzverarbeitung angewendet wurde.
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.