Einstiegshilfen zu H2 Database

internet

Top Contributor
Hallo,

ich benötige ein paar Einstiegshilfen bzgl. H2 Database.

Was ich benötige:
- Datenbank muss nicht im Internet stehen bzw. andere Clients darauf zugreifen. Es reicht, wenn die Datenbank auf dem Desktop (also ein Client) läuft.
- Ich habe eine Standalone Desktop Applikation
- Datenbank soll via JAVA Code gestartet / gestoppt werden
- Ich möchte Hibernate verwenden

Dazu habe ich folgende Fragen:
1) Generell die Frage, benötige ich hierfür eine
a) Server mode (tendieren ich dazu, da, ich dann u.a. starten / stoppen via Java Code kann, siehe auch: http://www.mastertheboss.com/jbossas/jboss-datasource/h2-database-tutorial/)
b) Embedded mode
c) Mixed Mode

2) Ich möchte JPA nutzen. Wenn ich es richtig sehe, muss ich hierfür die persistence.xml entsprechend anpassen?

3) Wo speichert H2 die Daten ab? Wo kann ich den Pfad angeben? Am Besten möchte ich das in dem Pfad ablegen, wo auch meine .jar - Datei zum Ausführen der Standalone App liegt

4) Was wird generell benötigt, um dies lauffähig zu machen? Reicht schon dies in meine pom.xml hinzuzufügen:
Java:
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

Danke für die Hilfen
 

LimDul

Top Contributor
ist zwar von 2016 sollte aber immer noch passen:


Kurzfassung:
* H2 als Dependency hinzufügen
* Über den Connection String wird der Modus gesteuert - Embedded ist am einfachsten, weil dann muss man nichts weiter tun. Dann läuft die gesamte Logik in der Anwendung
* In der Persistence.xml kann man den den Connection String angeben.
 

internet

Top Contributor
Super, danke... Hilft mir weiter.

Zur Angabe des Pfads eine Frage:
Der Pfad soll auf der gleichen Ebene in einem Ordner "data" gemapped sein, wo das .jar - File liegt:

Wäre das dann:
jdbc:h2:file:/data/myh2database
myh2database = ist dann der Name der DB?
 

LimDul

Top Contributor
Nein, wenn es mit einem Schraegstrich beginnt, ist es einer absoluter Pfad (von root ausgehend). "./" waere im aktuellen Verzeichnis, also zum Beispiel "jdbc:h2:file:./data/database.h2".
Wobei das aber auch nicht das Verzeichnis ist, wo die Jar Datei liegt, sondern relativ zu dem von wo die jar Datei gestartet wurde, oder?

Das wird in vielen Fällen das selbe sein - aber nicht in allen, sprich wenn ich die Jar starte mit

Code:
c:\MyDir> java -jar subDir\programm.jar
Dann referenziert das auf c:\myDir\data\myH2Database

Grundsätzlich würde ich auch nicht empfehlen sowas im Programmverzeichnis abzulegen, sondern an Stellen, die dafür besser gedacht sind. Wenn das Jar z.B. über ein Netzwerklaufwerk gestartet wird, ist das eher ungünstig. In Firmen kann es sein, dass das Programm unter c:\Program Files liegt, der angemeldete Benutzer aber keine Schreibrechte drauf hat.

Daher würde ich empfehlen einen Pfad relativ zum Homeverzeichnis zu wählen, z.B. "~/.myProgramm/myH2Database
 

Oneixee5

Top Contributor
Hier mal ein kleiner Einstieg zum probieren. Das sollte soweit verständlich sein.

[CODE lang="xml" title="pom.xml"]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>playground</groupId>
<artifactId>playground.swing</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath />
</parent>

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>[/CODE]
[CODE lang="java" title="SwingApp.java"]package playground;

import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class SwingApp extends JFrame implements CommandLineRunner {

@Autowired
private StudentRepository repo;

public SwingApp() {
}

private void initUI() {
final var closeButton = new JButton("Close");
closeButton.addActionListener(e -> {
System.exit(0);
});
// set db content to labels
final Student s1 = this.repo.findById(2).orElseThrow();
final var label1 = new JLabel(s1.toString());

final Student s2 = this.repo.findById(1).orElseThrow();
final var label2 = new JLabel(s2.toString());

createLayout(closeButton, label1, label2);

setTitle("Playground");
setSize(350, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

private void createLayout(final JComponent... components) {
final var pane = getContentPane();
pane.setLayout(new FlowLayout());
pane.add(components[2]);
pane.add(components[1]);
pane.add(components[0]);
}

@Override
public void run(final String... args) throws Exception {
// set up db
Student student = new Student();
student.setFirstName("Hans");
student.setName("Dampf");
this.repo.save(student);

student = new Student();
student.setFirstName("Horst");
student.setName("Heimlich");
this.repo.save(student);

initUI();
}

public static void main(final String[] args) {
final var ctx = new SpringApplicationBuilder(SwingApp.class).headless(false).run(args);
EventQueue.invokeLater(() -> {
final var ex = ctx.getBean(SwingApp.class);
ex.setVisible(true);
});
}

}[/CODE]
[CODE lang="java" title="Student.java"]package playground;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String firstName;
private String name;

public Student() {
}

public Integer getId() {
return this.id;
}

public void setId(final Integer id) {
this.id = id;
}

public String getFirstName() {
return this.firstName;
}

public void setFirstName(final String firstName) {
this.firstName = firstName;
}

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

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

@Override
public String toString() {
return "Student [id=" + this.id + ", firstName=" + this.firstName + ", name=" + this.name + "]";
}

}[/CODE]

[CODE lang="java" title="StudentRepository.java"]package playground;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {
}[/CODE]
[CODE lang="java" title="application.properties"]pring.datasource.url=jdbc:h2:mem:playground
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=[/CODE]

1634839056235.png
1634839605217.png
 

Ähnliche Java Themen


Oben