Hibernate/H2: Datenbank bei Erststart erzeugen

Status
Nicht offen für weitere Antworten.

resTive

Mitglied
Hallo,

ich experimentiere gerade ein wenig mit hibernate, und versuche ein Gefühl dafür zu kriegen. Ich möchte nun erreichen, dass meine (absolut fiktive) Applikation bei ihrem Start prüft ob die Datenbank vorhanden ist oder nicht. In letzterem Fall soll diese automatisch anhand des Schemas, welches (wenn ich das richtig verstanden habe) zuvor schon durch das mapping festgelegt wurde, erstellt werden.

Nach dem ich jetzt eine weile rumprobiert und gelesen habe bin ich auf folgendes das property hibernate.hbm2ddl.auto gestoßen. :rtfm:???:L

die werte für diese property sind wenn ich sie richtig verstanden habe
  • create: erzeugt einmalig beim starten der ersten session ein neues schema.
  • create-drop: erzeugt für jede session die datenbank und löscht diese wenn die session beendet wurde
  • update: passt das schema bei Änderungen an.
  • validate: kann ich mir keinen richtigen reim drauf machen (als nebenfrage: wofür ist validate gedacht?)

das update scheint mir genau das richtige zu sein, aber auch nur dann, wenn die Datenbank bereits existiert.

Wie stelle ich es also an, dass mir die eine Datenbank erstellt wird, wenn die Applikation keine unter der konfigurierten connection.url finden kann? oder ist das mit hibernate garnicht möglich, und ich muss sie selbst erstellen?

wäre super, wenn mir da wer weiterhelfen kann.
 

resTive

Mitglied
Hätte jetzt gedacht, dass es mit update funktioniert. [...]

hm, hatte ich auch gedacht. allerdings habe ich unter anderem im hibernate forum und auf stackoverflow immer wieder gelesen das update in produktionsumgebungen nicht benutzt werden soll weil a) kein entwickler (selbst hibernate devs) dem nicht 100% trauen würden und b) soll es auch nicht mehr gewartet werden (siehe hier) allerdings ist der post von 2003 :autsch:

[...]Aber wenns so ist wie Du sagst, dann kannst Du den Prozess auch manuell anstoßen, z.b. mit Ant:

Chapter*20.*Toolset Guide

von ant habe ich allerdings auch (noch) garkeine ahnung. gehe ich recht der annahme, dass du mir vorschlägst im final build per ant eben jene (leere) datenbank anzulegen und mit auszuliefern?

in genau dem genannten thread habe ich auch hibernate.hbm2ddl.auto=create-update gefunden, das auch genau das macht, was man erwarten würde (erzeugen oder verwenden). allerdings sagt auch dazu der entwickler in dem selben thread dass das eigentlich nicht funktionieren dürfe und er es mysteriös finden ;(


ja verdammt, ich kann doch nicht der einzige entwickler auf der welt sein der eine anwendung verteilen will, welches eine emedded datenbank benutzt, die beim start noch keine daten enthält...

weil so fiktiv ist die anwendung nicht mehr, nachdem ich da jetzt ne weile rumprobiert und gemacht und getan habe, habe ich schon ein konkretes projekt vor augen (RCP+JavaWebStart+Hibernate/H2), wo ich das verdammt gut gebrauchen kann... allerdings möchte ich dieses problem, und auch andere, gelöst haben bevor ich überhaupt mit der planung anfange.


also weiterhin sind hilfen anmerkungen, links erwünscht, die mir das licht am ende des tunnels zeigen könnten ;)

EDIT
Wie wäre es mit Create? :D

create ist während der entwicklung nicht verkehrt richtig, in der produktion wäre es allerdings fatal, wenn ich bei jedem start diese datenbank lösche ;)
 
Zuletzt bearbeitet:

byte

Top Contributor
Über die Güte von hbm2ddl kann ich Dir nichts sagen. Wir machen es so, dass wir uns die DDL von Hibernate erzeugen (also nur das Script), diese dann noch manuell anpassen und dann das Schema manuell mit einem DB Tool aufspielen.

Mir fällt jetzt aber auch kein Grund ein, warum man das bei einer Embedded DB nicht direkt mit hbm2ddl machen sollte, wenn die erzeugte DDL im Test einwandfrei funktioniert.
 

-MacNuke-

Bekanntes Mitglied
create ist während der entwicklung nicht verkehrt richtig, in der produktion wäre es allerdings fatal, wenn ich bei jedem start diese datenbank lösche ;)

Also mir ist noch keine Datenbank untergekommen die bei einem CREATE TABLE die Tabelle löscht ;)

Das update kannst du vergessen. Funktioniert nicht immer.
 

Prismapanda

Aktives Mitglied
So wie ich das sehe, kann Hibernate die Datenbank selbst nicht anlegen (das war doch die Frage oder?), nur eben das zugrundelegende Schema. Dies kann dann mit den erwähnten Werten erfolgen. 'update' funktioniert in der Tat nicht immer richtig beim Aktualisieren eines Schemas, insbesondere wenns um Schlüssel und Collections geht. Im Erstellen der Tabelle arbeitet es aber IMO genauso wie 'create'.
Ich würde für Produktionsumgebungen empfehlen, das Schema zu exportieren und mittels eigenem Script einzuspielen. Dann kannst du die Datenbank dort anlegen, Schema einspielen und die Property auf 'none' setzen.
Für die Entwicklung nehme ich immer 'update', weil da die Daten drinbleiben und simple Änderungen (neue Variable etc.) mit eingespielt werden, ohne das Schema neu anzulegen.

Ich bezieh mich da jetzt mal auf den Thread https://forum.hibernate.org/viewtopic.php?p=2299145&sid=52f0ac9ed40120d9a6f0ab4f53fe2809. Der ist allerdings auch schon 3 Jährchen alt, aber es klingt zumindest so, als wär da keine Möglichkeit das zu ändern.
Wer neuere Infos hat - wäre für ein Update auch dankbar :)
 

resTive

Mitglied
entschuldigt, habe die neuen Posts heute erst gesehen. danke für eure antworten.

Da ich, wenn alles so läuft wie geplant, über die Verteilung dieser Anwendung keine Kontrolle haben werden, fällt ein manuelles anlegen der Datenbank aus. Und da es eine Delete&Forget Anwendung werden soll, soll alles von dem Programm benötigte angelegt oder sonstwie zur Verfügung gestellt werden. Daher auch die lokale dateibasierte Datenbank H2 (oder HSQLDB, Derby) was auch immer...


nun da ich jetzt mehr oder weniger die restlichen tage meine freizeit für dieses Problem geopfert habe, die Datenbank automatisiert anlegen zu lassen, habe ich mich für die Variante des SchemaExport entschieden. Einzige problem, dass ich mit dieser Variante mehr oder weniger auf H2 festgelegt bin.

Da die Hibernate configuration ja in ihrer connection url ja auch den speicherort stehen hat, und ich weis, dass diese Datei mit '.h2.db' endet überprüfe ich, ob diese Datei im gewünschten Pfad vorhanden ist und wenn nicht, dann lege ich die Datei mit folgendem Snippet an.

Code:
AnnotationConfiguration config      = new AnnotationConfiguration();
config.configure();
config.setProperty("hibernate.connection.url", URL);
config.addAnnotatedClass(Clazz1.class);
config.addAnnotatedClass(Clazz2.class);
config.addAnnotatedClass(ClazzN.class);
factory = config.buildSessionFactory();
[b]new SchemaExport(config).execute(true, true, false, true);[/b]

da damit mein problem gelöst ist, ist die frage auch nicht mehr offen.

Danke für eure Hilfe
 
B

blublablo

Gast
Hi, ich stand auch mal vor diesem Problem und löse das Problem mit einer simplen SQL-Abfrage. Man kann nämlich die Tabellen nur anlegen lassen, wenn diese noch nicht existieren:

CREATE TABLE IF NOT EXISTS FILM (
SPALTE1 VARCHAR(80),
SPALTE2 VARCHAR(80),
...
);

Diese SQL lässt du jedes Mal bei Verwenden deiner Datenbank aufrufen. Die Tabellen werden dann nur erzeugt, wenn diese noch nicht existieren. H2 erzeugt übrigens völlig automatisiert die Datenbank, wenn diese noch nicht existiert, Beispiel:
[Java]
// Verbindung zur H2-Datenbank aufbauen
Connection h2Connection = DriverManager.getConnection("jdbc:h2:"C:\\H2Datenbank", "sa", "");
[/code]

Würde nun unter "C:" die Datenbankdatei "H2Datenbank.h2.db" anlegen, falls diese nicht existiert.

Grüße
 
M

maki

Gast
Wenn man JPA (oder ein anderes ORM) nutzt und die Entities Refactored, muss die DB Struktur & die Daten(!!!) auch refactored werden, für letzteres gibt es keinen automatismus ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
MU5T4NG Datum mit Hibernate in Datenbank speicher Datenbankprogrammierung 2
M Datenbank mit Hibernate erstellen Datenbankprogrammierung 5
Y Hibernate - externe Datenbank zur Laufzeit ansprechen Datenbankprogrammierung 5
C MySQL Datenbank mit Hibernate befüllen Datenbankprogrammierung 5
S Daten verschlüsselt ablegen in der Datenbank mit Hibernate Datenbankprogrammierung 6
W Hibernate: Komplette Datenbank in Speicher laden? Datenbankprogrammierung 5
krgewb Hibernate: Fremdschlüssel wird nicht erzeugt Datenbankprogrammierung 2
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4

Ähnliche Java Themen


Oben