# JPA / Hibernate mit Postgres DB



## Moinuell (28. Sep 2012)

Hallo,

ich versuche mich gerade an GWT, Request Factory + JPA with Hibernate.
Hierbei habe ich Probleme mit JPA / Hibernate.
Ich möchte Daten in meiner lokalen postgres Db speicher.
Scheintbar funktioniert zwar alles, aber eben nur scheinbar.

Ich erstelle eine EntityManagerFactory 

```
private static final EntityManagerFactory emfInstance = Persistence.createEntityManagerFactory("kunde");
```

einen Entity Manager

```
EMF.createEntityManager();
```

Objekt persistieren

```
em.persist(Worker);
```

Soweit funktioniert auch alles.
Persistieren von Objekten geht zwar, aber die Daten landen nicht in meiner lokalen Datenbank.
D.h. die Daten werden irgendwo anders gespeichert, ich kann aber nicht rausfinden wo :/

Zudem weiß ich nicht genau, was ich alles in der persistence.xml angeben muss.
Gebe ich z.B. als Provider: <provider>org.hibernate.ejb.HibernatePersistence</provider>
an, läuft es schon nicht mehr.

Habe erst mit Hibernate angefangen... Wäre super wenn mir hier jemand helfen könnte.

Gruß,
Manuel


Hier noch etwas Code, wenn ihr noch mehr Infos braucht, sagt bescheid.

Meine Entity Class

```
package de.mash.project.server;

import java.util.List;

import javax.jdo.annotations.Transactional;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "Worker")
public class Worker {

   public static Worker findWorker(Long id) {
      // if (id == 0) {
      return null;
      // }
      // EntityManager em = entityManager();
      // try {
      // Worker worker = em.find(Worker.class, id);
      // return worker;
      // } finally {
      // em.close();
      // }
   }

   @Transient
   protected Object[] jdoDetachedState;

   // @Id
   // @GeneratedValue(generator = "auto_increment")
   // @GenericGenerator(name = "auto_increment", strategy = "increment")
   // @Column(name = "id")
   // private int id;

   @Id
   @Column(name = "id")
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column(name = "first_name")
   private String firstName;

   @Column(name = "last_name")
   private String lastName;

   @Column(name = "salary")
   private int salary;

   public Worker() {
   }

   public Worker(String fname, String lname, int salary) {
      this.firstName = fname;
      this.lastName = lname;
      this.salary = salary;
   }

   public Long getId() {
      return id;
   }

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

   public String getFirstName() {
      return firstName;
   }

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

   public String getLastName() {
      return lastName;
   }

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

   public int getSalary() {
      return salary;
   }

   public void setSalary(int salary) {
      this.salary = salary;
   }

   public static Long countWorkers() {
      return 2l;
   }

   public Integer getVersion() {
      return 1;
   }

   public void persist() {
      EntityManager em = entityManager();
      try {
         // em.getTransaction().begin();
         em.persist(this);
         // em.flush();
         // em.getTransaction().commit();
      } catch (Exception e) {
         int i = 1;
      } finally {
         em.close();
      }

      em = entityManager();

      final List<Worker> list = em.createQuery("select p from Worker p").getResultList();

      System.out.println(list.size());
      for (Worker current : list) {
         System.out.println(current.getFirstName() + " " + current.getLastName() + " " + current.getSalary());
      }

      em.close();

   }

   public static final EntityManager entityManager() {
      return EMF.get().createEntityManager();
   }

}
```


Meine persistence.xml

```
<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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" version="1.0">
   
    <persistence-unit name="kunde" transaction-type="RESOURCE_LOCAL">
        <class>de.mash.project.server.Worker</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.show_sql" value="true" />
           
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/dev_mash" />
            <property name="hibernate.connection.username" value="postgres" />
            <property name="hibernate.connection.password" value="m4nu3l" />
            <property name="hibernate.default_schema" value="public" />
           
            <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>
   
</persistence>
```


----------



## SlaterB (28. Sep 2012)

wenn ich mir Standard-Beispiele anschaue
Chapter*4.*Tutorial Using the Java Persistence API (JPA)
dann wird dort eine Transaktion verwendet, die du bei dir auskommentiert hast,

weißt du was eine Transaktion, was Commit ist?
könnte genau der Grund sein, warum Änderungen nicht persistent in der DB landen

eine mögliche Exception ist natürlich auch immer eine gute Variante, wieso gibst du im catch die Information nicht aus?
ist try/catch vielleicht (auch?) was völlig neues für dich? nicht gut zig unbekannte Dinge zu kombinieren,
vor DB besser einige allgemeine Javakenntnisse 

-----

'irgendwo anders gespeichert' ist nur wild von dir spekuliert?
falls die richtigen Tabellen usw. da sind, kann schon kaum Zweifel bestehen,
bei mehreren gleichen Datenbanken kann man noch als Test in einer bestimmte einen neuen individuellen Eintrag speichern
(mit einem robusten externen DB-Tool),
wenn der gelesen wird (Lesen immer vor Speichern üben) dann ist das schon recht eindeutig

edit:
mit Auto-Create usw. fällt das aber vielleicht aus, immer neue leere DB,
kein guter Anfang finde ich, lieber auf eine nachprüfbare vorhandene DB zugreifen, extern eingerichtet,
aber muss natürlich auch erstmal alles klappen, Schwierigkeiten gibts überall


----------



## Moinuell (28. Sep 2012)

Hey,

erstmal danke für deine Antwort.

Die Daten werden ja persistiert. Aber eben nicht in meiner lokalen DB (die ich in meiner persistence:xml angegeben hab), sondern irgendwo anders :/
Das wundert mich ja, denn es gibts ja keine andere Stelle wo man das angibt oder?

Hab das mal mit dem catch gemacht, da kam folgendes raus:

Explicit persistence provider error(s) occurred for "kunde" 
after trying the following discovered implementations: 
org.datanucleus.api.jpa.PersistenceProviderImpl, 
org.hibernate.ejb.HibernatePersistence from provider: 
org.hibernate.ejb.HibernatePersistence


Also da muss ich nochmal schauen wo der Datanucleus herkommt.
Wollte eigtl nur wissen, ob ich einen generellen Fehler drin habe, oder obs an was anderem liegt.

Btw: Zum Ausprobieren habe ich die Zeilen für die Transaktion ein/auskommentiert, um überhaupt einen unterschied festzustellen.

Bis dahin,
Gruß


----------



## Moinuell (29. Sep 2012)

Wollte hier nochmal berichten:
Das Problem hat sich mittlerweile gelöst. Es lag nicht am Hibernate/Konfig,
sondern daran das in meinem GWT Project die Google App Engine (GAE) aktiviert war.

Gruß


----------

