2012-01-17 2 views
2

У меня есть проблема с JPA я подробно объясню:Ошибка с JPA (Дамп базы данных после каждого исполнения)?

Я создал проект в NetBeans «Java Application», затем щелкните правой кнопкой мыши на пакете «Классы сущностей из базы данных» Я выбрал DB, это хороший объект создается с помощью геттеров, сеттеров и атрибутов БД. Наконец: щелкните правой кнопкой мыши на том же пакете «Классы контроллера JPA от классов сущностей», и я выбрал созданный ранее объект, файл генерируется с помощью методов взаимодействия с БД ... Все идет хорошо до сих пор, Но когда Я запускаю проект и после каждой операции (создаю, нахожу, ..) база данных сбрасывается, и программа продолжает выполнение без ошибок, например, если я решил вставить новую запись в БД, остальные записи удаляются, а запись вставляется в БД правильно! Я не понимаю, почему, если один из вас может объяснить эту ошибку, это будет слишком круто ... вот мой исходный код:

+Here I have a database its called "personne" containing only a one table also called "personne"(id=int,nom=varchar(30)). 

+ Testt.java (основная программа):

package testt; 

import javax.persistence.EntityManagerFactory; 

import javax.persistence.Persistence; 

import testt.exceptions.PreexistingEntityException; 


public class Testt { 
public static void main(String[] args) throws PreexistingEntityException, Exception { 


EntityManagerFactory emf = Persistence.createEntityManagerFactory("testtPU"); 
Personne p=new Personne(2); 
p.setNom("ME ME"); 
PersonneJpaController tjc=new PersonneJpaController(emf); 

tjc.create(p); 

System.out.println("succeed! "); 
} 
} 

Personne.java (предприятие "Personne" его создал (генерируется) из базы данных):

package testt; 

import java.io.Serializable; 
import javax.persistence.*; 
import javax.xml.bind.annotation.XmlRootElement; 
@Entity 
@Table(name = "PERSONNE", catalog = "", schema = "ROOT") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Personne.findAll", query = "SELECT p FROM Personne p"), 
@NamedQuery(name = "Personne.findById", query = "SELECT p FROM Personne p WHERE p.id =   :id"), 
@NamedQuery(name = "Personne.findByNom", query = "SELECT p FROM Personne p WHERE p.nom = :nom")}) 
public class Personne implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@Column(name = "ID", nullable = false) 
private Integer id; 
@Column(name = "NOM", length = 30) 
private String nom; 

public Personne() { 
} 

public Personne(Integer id) { 
    this.id = id; 
} 

public Integer getId() { 
    return id; 
} 

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

public String getNom() { 
    return nom; 
} 

public void setNom(String nom) { 
    this.nom = nom; 
} 

@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 Personne)) { 
     return false; 
    } 
    Personne other = (Personne) 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 "testt.Personne[ id=" + id + " ]"; 
} 

} 

PersonneJpaController.java (генерируемый из "Personne" лица)

package testt; 

import java.io.Serializable; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Query; 
import javax.persistence.EntityNotFoundException; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 
import testt.exceptions.NonexistentEntityException; 
import testt.exceptions.PreexistingEntityException; 


public class PersonneJpaController implements Serializable { 

public PersonneJpaController(EntityManagerFactory emf) { 
    this.emf = emf; 
} 
private EntityManagerFactory emf = null; 

public EntityManager getEntityManager() { 
    return emf.createEntityManager(); 
} 

public void create(Personne personne) throws PreexistingEntityException, Exception { 
    EntityManager em = null; 
    try { 
     em = getEntityManager(); 
     em.getTransaction().begin(); 
     em.persist(personne); 
     em.getTransaction().commit(); 
    } catch (Exception ex) { 
     if (findPersonne(personne.getId()) != null) { 
      throw new PreexistingEntityException("Personne " + personne + " already exists.", ex); 
     } 
     throw ex; 
    } finally { 
     if (em != null) { 
      em.close(); 
     } 
    } 
} 

public void edit(Personne personne) throws NonexistentEntityException, Exception { 
    EntityManager em = null; 
    try { 
     em = getEntityManager(); 
     em.getTransaction().begin(); 
     personne = em.merge(personne); 
     em.getTransaction().commit(); 
    } catch (Exception ex) { 
     String msg = ex.getLocalizedMessage(); 
     if (msg == null || msg.length() == 0) { 
      Integer id = personne.getId(); 
      if (findPersonne(id) == null) { 
       throw new NonexistentEntityException("The personne with id " + id + " no longer exists."); 
      } 
     } 
     throw ex; 
    } finally { 
     if (em != null) { 
      em.close(); 
     } 
    } 
} 

public void destroy(Integer id) throws NonexistentEntityException { 
    EntityManager em = null; 
    try { 
     em = getEntityManager(); 
     em.getTransaction().begin(); 
     Personne personne; 
     try { 
      personne = em.getReference(Personne.class, id); 
      personne.getId(); 
     } catch (EntityNotFoundException enfe) { 
      throw new NonexistentEntityException("The personne with id " + id + " no longer exists.", enfe); 
     } 
     em.remove(personne); 
     em.getTransaction().commit(); 
    } finally { 
     if (em != null) { 
      em.close(); 
     } 
    } 
} 

public List<Personne> findPersonneEntities() { 
    return findPersonneEntities(true, -1, -1); 
} 

public List<Personne> findPersonneEntities(int maxResults, int firstResult) { 
    return findPersonneEntities(false, maxResults, firstResult); 
} 

private List<Personne> findPersonneEntities(boolean all, int maxResults, int firstResult) { 
    EntityManager em = getEntityManager(); 
    try { 
     CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(Personne.class)); 
     Query q = em.createQuery(cq); 
     if (!all) { 
      q.setMaxResults(maxResults); 
      q.setFirstResult(firstResult); 
     } 
     return q.getResultList(); 
    } finally { 
     em.close(); 
    } 
} 

public Personne findPersonne(Integer id) { 
    EntityManager em = getEntityManager(); 
    try { 
     return em.find(Personne.class, id); 
    } finally { 
     em.close(); 
    } 
} 

public int getPersonneCount() { 
    EntityManager em = getEntityManager(); 
    try { 
     CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
     Root<Personne> rt = cq.from(Personne.class); 
     cq.select(em.getCriteriaBuilder().count(rt)); 
     Query q = em.createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } finally { 
     em.close(); 
    } 
} 

} 

наконец persistance.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
<persistence-unit name="testtPU" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<class>testt.Personne</class> 
<properties> 
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/personne"/> 
<property name="javax.persistence.jdbc.password" value="1234"/> 
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
<property name="javax.persistence.jdbc.user" value="root"/> 
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
</properties> 
</persistence-unit> 
</persistence> 

заранее спасибо ^^

ответ

4

После первого запуска, вам нужно удалить строку

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 

с упорством. xml, иначе EclipseLink будет повторно создавать таблицу каждый раз. Вот почему вы считаете его пустым. Проверьте это в wiki.

+0

Спасибо, что это работает. –

Смежные вопросы