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
Entities:
Main-Methode beim Erstellen der Daten
Vorige Main geändert in:
Ich hoffe jemand kann mir sagen was ich verchecke =)
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
Java:
<?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:
Java:
@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
Java:
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:
Java:
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 =)