# Verständnis-Problem JPA Grundlagen



## weeedoo (11. Mai 2010)

Hallo zusammen,
ich habe mir in den letzten Tagen JPA Grundlagen angeeignet und dachte dass ich grob wüsste was ich tue, hab nun aber ein blöd elementares Problem.
Ich benutze MySQL und Hibernate, entwickeln tue ich mit Netbeans.

Die Code-Ausschnitte sind quick und dirty entstanden, also sorry für alle StilFauxpas  

Im ersten Schritt habe ich diverse Entity-Instanzen erstellt und persistent in die DB geschrieben, was auch funktioniert.
Als ich das Programm änderte um ein bisschen mit dem Auslesen und Manipulieren der Datensätze zu spielen, verschwanden alle Datensätze, nur die blanken tables blieben?!
Ich wollte also ganz platt die Generierung der Daten aus der main-Methode rausnehmen und durch manipulierende Anweisungen ersetzen. 
Schon das Instanzieren einer EntityManagerFactory genügt um vorher persistente Daten zu löschen.

Meine Vermutung ist (neben der dass ich vor Bäumen den Wald nicht sehe) dass die properties in der persistence.xml falsch sind....oder ich ich irgendetwas ganz wesentliches von JPA nicht checke =)

persistence.xml

```
<?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="JPAtest1PU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>jpatest1.Computer</class>
    <class>jpatest1.Nutzer</class>
    <properties>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.password" value="XXXXX"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/myDB"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.show_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>
```

Entities:

```
@Entity
public class Computer implements Serializable {
    
    
    private Long id;
    private String bezeichnung;
    private Nutzer nutzer;

    public String getBezeichnung() {
        return bezeichnung;
    }

    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

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

    @ManyToOne
    @JoinColumn(name="nutzer")
    public Nutzer getNutzer() {
        return nutzer;
    }

    public void setNutzer(Nutzer nutzer) {
        this.nutzer = nutzer;
    }
}

@Entity
public class Nutzer implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String name;
    private int nr;
    private boolean thief;
    private Set<Computer> computer = new HashSet<Computer>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getNr() {
        return nr;
    }

    public void setNr(int nr) {
        this.nr = nr;
    }

    public boolean isThief() {
        return thief;
    }

    public void setThief(boolean thief) {
        this.thief = thief;
    }

    @OneToMany(cascade = javax.persistence.CascadeType.ALL, mappedBy = "nutzer")
    public Set<Computer> getComputer() {
        return computer;
    }

    public void setComputer(Set<Computer> computer) {
        this.computer = computer;
    }

    public void addComputer(Computer c){
        computer.add(c);
        c.setNutzer(this);
    }


    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Nutzer)) {
            return false;
        }
        Nutzer other = (Nutzer) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "jpatest1.Nutzer[id=" + id + "]"+" Name: "+getName();
    }


}
```

Main-Methode beim Erstellen der Daten

```
public class Main {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAtest1PU");
        EntityManager em = emf.createEntityManager();

        Collection<Computer> comps = null;

        Nutzer us1 = new Nutzer();
        Nutzer us2 = new Nutzer();

        us2.setName("odfg");
        us2.setNr(455);
        us2.setThief(false);

        Computer comp11 = new Computer();
        comp11.setBezeichnung("xxspawned");
        us2.addComputer(comp11);
    
        //das ganze ein paar mal für weitere computer-instanzen

        em.persist(us1);
        em.persist(us2);
        EntityTransaction trans = em.getTransaction();
        trans.begin(); 
        trans.commit();
    }
}
```

Vorige Main geändert in:

```
public class Main {


    public static void main(String[] args) {

        //Erste Zeile "genügt" um daten zu löschen
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAtest1PU");

        EntityManager em = emf.createEntityManager();

        Nutzer temp = em.find(Nutzer.class,1L);
        
        temp.setName("Hamal Mashburn");
        em.merge(temp);


    }

}
```

Ich hoffe jemand kann mir sagen was ich verchecke =)


----------



## Gelöschtes Mitglied 5909 (11. Mai 2010)

du weißt wie eine transaktion funktioniert?


```
em.persist(us1);
        em.persist(us2);
        EntityTransaction trans = em.getTransaction();
        trans.begin(); 
        trans.commit();
```

wenn du mal in die datenbank direkt geschaut hättest, hättest du gesehn dass die daten da nie ankommen

So sollte es funktionieren


```
EntityTransaction trans = em.getTransaction();
        trans.begin(); 
        em.persist(us1);
        em.persist(us2); 
       trans.commit();
```


----------



## weeedoo (11. Mai 2010)

Danke für die schnelle Antwort, aber das ist es nicht.
Wenn ich das Programm mit der ursprünglichen main-Methode ausführe, stehen danach die Daten so wie sie sollen in der DB - genauso wie mit deiner Code-Veränderung. (Überprüf ich im Dienste Fenster von NetBeans > Daten anzeigen)

Ändere ich danach die main() werden dabei die Datensätze gelöscht, selbst wenn in ihr nichts steht ausser 

```
public static void main(String[] args) {
   EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAtest1PU");
}
```


----------



## weeedoo (12. Mai 2010)

Okay, hab's lösen können indem ich als Persistence Library EclipseLink statt Hibernate gewählt habe.

Keinerlei Veränderungen am Code! Ob Netbeans vllt. eine "nicht optimal" konfigurierte persistence.xml für Hibernate 
default-mäßig erstellt? 
Falls mir jemand sagen kann was in der zuvor geposteten persistence.xml falsch oder fehlend ist, wäre ich sehr 
dankbar =)   An der Table Generation Strategy kann es nicht liegen, da hab ich Trial'n'Error mäßig alles durchprobiert.


----------



## maki (12. Mai 2010)

Vielleciht mal an der hibernate.hbm2ddl.auto Option fummeln?


----------



## weeedoo (12. Mai 2010)

maki hat gesagt.:


> Vielleciht mal an der hibernate.hbm2ddl.auto Option fummeln?



ich hatte es mit hibernate.hbm2ddl.validate probiert, da dies die "passivste" Variante ist; auch ohne Erfolg. (Achtung gefährliches Halbwissen: ) Ich vermute bei dem hbm2dll geht es ausschliesslich um den Aufbau der Tabellen und nicht deren Inhalt...natürlich werden andererseits auch die Inhalte gedropped bei einer Veränderung des Schemas...

Naja, ich hab mich entschlossen einfach mit der EclipseLink Library weiter zu arbeiten  und werde den Thread deshalb als erledigt markieren... weitere Lösungsvorschläge würden mich dennoch interessieren 
Dank an alle


----------

