Hibernate überschreibt Datenbankeinträge

tbone13

Grünschnabel
Hallo zusammen!
Ich arbeite mich in JPA ein und verstehe grad das Verhalten meines Systems nicht. Ich habe eine einfach Entity Class und eine Main Class. Letztere erzeugt zwei Instanzen der Entität und persistiert sie in die DB. So weit so gut. Rufe ich aber das Programm erneut auf, werden die Datensätze in der Datenbank überschrieben und ich hab wieder nur 2 Datensätze. Es sind aber immer zwei neue, dass habe ich mittels einer zufallszahl in den Datensätzen sichergestellt. Außerdem gegen eine HSQLDB und gegen Apache Derby getestet.

Ich bin rat- und sprachlos. Ich versteh das doch eigentlich so, dass persistierte Datensätze erhalten bleiben sollen. Also sollten pro aufruf meine Main neue Sätze in DB geschrieben werden.

Lange Rede, kurzer Sinn; hier der Code:

Die Bohne "Person"


Code:
package org.spiceeinc.JPAStandalone;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Entity implementation class for Entity: Person
 * 
 */
@Entity
@Table(name = "person")
public class Person implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@Basic
	@Column(name = "first_name", length = 120)
	private String firstName;

	@Basic
	@Column(name = "last_name", length = 120)
	private String lastName;

	protected Person() {
		super();
	}

	public Person(String firstName, String lastName) {
		// super();
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public String getFirstName() {
		return firstName;
	}

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

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public int getId() {
		return id;
	}

	private static final long serialVersionUID = 1L;

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Person: " + "[" + id + "]: " + firstName + " " + lastName;
	}

}

Die Main Klasse

Code:
package org.spiceeinc.JPAStandalone;

import java.util.Random;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			EntityManagerFactory emf = Persistence
					.createEntityManagerFactory("JPAStandalone");

			createPerson(emf);
			createPerson(emf);
			findByPrimaryKey(emf, 1);
			findByPrimaryKey(emf, 2);

			// TODO something else

			emf.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void findByPrimaryKey(EntityManagerFactory emf, int i) {
		EntityManager manager = emf.createEntityManager();
		Person p = manager.find(Person.class, i);

		if (p != null) {
			System.out.println(p.toString());
		} else {
			System.out.println("Datensatz nicht gefunden");
		}
		manager.close();
	}

	private static void createPerson(EntityManagerFactory emf) {
		EntityManager manager = emf.createEntityManager();
		manager.getTransaction().begin();

		Random r = new Random();
		int i = r.nextInt();
		Person person = new Person("Tobi" + i, "Schroeder" + i);

		manager.persist(person);
		manager.getTransaction().commit();
		manager.close();

		// DEBUG Ausgabe des Objekts
		System.out.println("Das erzeugte Objekt: " + person.toString());
	}

}

Die persistence.xml

Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<persistence-unit name="JPAStandalone" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<class>
	org.spiceeinc.JPAStandalone.Person</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver" />
			<property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/myDB" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
			<property name="hibernate.connection.username" value="me" />
			<property name="hibernate.connection.password" value="mine" />
			<property name="hibernate.max_fetch_depth" value="3" />
			<property name="hibernate.hbm2ddl.auto" value="create" />
			<property name="hibernate.show_sql" value="true"/>
		</properties>
	</persistence-unit>
</persistence>

Hier jetzt mit der Derby-Konfiguration

Ich bin für jeden Fingerzeig dankbar!

Grüß

Tobi
 
Soweit ich weiß sind beide Datenbanken InMemory Datenbanken. D.h. der Inhalt ist logischerweise nach Programmende weg. Hast du es schonmal mit einer MySQL probiert?

Gruß
Ollie
 
MySQL noch nicht. Aber ich werd das dann mal nachholen.

Vielleicht fehlt aber noch in meiner Ausführung, das ich nach einem Programmlauf die Datensätze abfragen kann. Beide Datenbanken laufen im Server-Modus. Ich würde es verstehen ,wenn die Daten nach neustart der DB weg wären. Aber das ist im Moment nur Intuition. ;-)

Erstmal besten Dank!
 
Ich hab grad eroiert wie sich das beschriebene Problem unter Verwendung einer MySQL-DB darstellt. Und ich muss berichten, dass da das Gleiche passiert. Also muss ich leider feststellen, das es nicht an den Datenbanken liegt.

*verzweifel*

erstmal einen angenehmen abend noch!

Grüße

Tobi
 
... und noch ein Update. Ich hab jetzt dieses Projektlein unter Verschiedenen Bedingungen durchgehaspelt.
IDE:
  • Eclipse 3.4RC4
  • Netbeans6
DBs:
  • HSQLDB
  • Apache Derby
  • MySQL
JPA aber immer mit Hibernate als Provider.

Ergebnis ist und bleibt gleich. Ich tippe jetzt mal doch wieder auf meine persistence.xml oder auf den EntityManager.

Hat irgendjemand sonst ne Idee?

Viele Grüße

Tobi
 
Hallo,

es liegt an dieser Zeile
Code:
<property name="hibernate.hbm2ddl.auto" value="create" />

Damit wird gesagt, dass Hibernate die Tabellen jedes ma neu anlegen soll. Wenn die Tabellen einmal existieren, entferne diese Zeile, dann müsste es funktionieren.

MFG

Sascha
 
Ich schätze das war's! ICh klär das grad mit meinem original Setup (Eclipse | Hibernate | HSQLDB). Das muss einem doch gesagt werden! ;-)
Ich find's aber auch etwas verwirrend. Ich hätte das jetzt eher so verstanden, das JPA die Tabelle im Falle der Nichtexistenz anlegen soll und nur dann. Naja, man soll nicht glauben wenn's um Rechenknechte geht! :google:

Besten Dank erstmal!

Grüße

Tobi
 

Neue Beiträge

Zurück