2013-02-23 39 views
3

我在Spring領域頗爲新穎,在這段時間我正在研究如何將它與Hibernate集成以創建我的DAO對象,但我發現一些難度與DELETE操作...Spring + Hibernate:我無法刪除表中的記錄

所以我有一個表的人,我有創建實現我的DAO對象這個具體類:

package org.andrea.myexample.HibernateOnSpring.dao; 

import java.util.List; 

import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.hibernate.Criteria; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.transaction.annotation.Transactional; 

public class PersonDAOImpl implements PersonDAO { 

private SessionFactory sessionFactory; 

public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

// Metodo che inserisce un nuovo record nella tabella person 
@Transactional(readOnly = false) 
public void addPerson(Person p) { 
    Session session = sessionFactory.openSession(); 
    session.save(p); 
    session.close(); 
} 

/* 
* Metodo che recupera un record, rappresentante una persona, avente uno 
* specifico id dalla tabella. 
* 
* @param L'id univoco della persona 
*/ 

public Person getById(int id) { 
    Session session = sessionFactory.openSession(); 
    try { 
     return (Person) session.get(Person.class, id); 
    } finally { 
     session.close(); 
    } 
} 

/* 
* Metodo che recupera la lista di tutti le persone rappresentanti dalle 
* righe della tabella person 
*/ 
@SuppressWarnings("unchecked") 
public List<Person> getPersonsList() { 

    Session session = sessionFactory.openSession(); 
    try { 

     Criteria criteria = session.createCriteria(Person.class); 
     return criteria.list(); 

    } finally { 
     session.close(); 
    } 

} 

/* 
* Metodo che elimina dalla tabella person la riga avente uno specifico id 
* 
* @param l'id della persona da eliminare dalla tabella person 
*/ 
public void delete(int id) { 

    Session session = sessionFactory.openSession(); 
    try { 
     Person personToDelete = getById(id); 
     session.delete(personToDelete); 

    } finally { 
     session.close(); 
    } 

} 

} 

然後,我有創建一個主類,以測試如何吾道工作 我沒有問題插入一個新的對象到dable中,以獲得單個對象或所有對象的列表在表中,但我發現問題從表中刪除一個對象。

這是我的測試類:

package org.andrea.myexample.HibernateOnSpring; 

import java.util.List; 

import org.andrea.myexample.HibernateOnSpring.dao.PersonDAO; 
import org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl; 
import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class App { 

public static void main(String[] args){ 

    ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 
    System.out.println("Contesto recuperato: " + context); 

    Person persona1 = new Person(); 

    persona1.setFirstname("Pippo"); 
    persona1.setLastname("Blabla"); 
    //persona1.setPid(1); 

    System.out.println("Creato persona1: " + persona1); 

    PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl"); 

    System.out.println("Creato dao object: " + dao); 

    dao.addPerson(persona1); 

    System.out.println("persona1 salvata nel database"); 

    Person personaEstratta = dao.getById(persona1.getPid()); 

    System.out.println("Persona con id: " + personaEstratta.getPid() + " estratta dal DB"); 
    System.out.println("Dati persona estratta:"); 
    System.out.println("Nome: " + personaEstratta.getFirstname()); 
    System.out.println("Cognome: " + personaEstratta.getLastname()); 

    System.out.println(""); 

    // STAMPA LA LISTA DELLE PERSONE NELLA TABELL person: 
    List<Person> listaPersone = dao.getPersonsList(); 
    System.out.println("Lista delle persone recuperata: " + listaPersone); 

    // MOSTRA I DATI DI TUTTE LE PERSONE NELLA LISTA: 
    for(int i=0; i<listaPersone.size(); i++){ 
     Person currentPerson = listaPersone.get(i); 
     System.out.println("id: " + currentPerson.getPid() 
          + " nome: " + currentPerson.getFirstname() 
          + " cognome: " + currentPerson.getLastname()); 
    } 

    // ELIMINAZIONE DI UNA PERSONA DALLA TABELLA person: 
    System.out.println(""); 
    System.out.println("ELIMINAZIONE DI UNA PERSONA DALLA TABELLA person:"); 


    // ELIMINA TUTTI I RECORD DALLA TABELLA persone: 
    for(int i=0; i<listaPersone.size(); i++){ 
     dao.delete(listaPersone.get(i).getPid()); 
     System.out.println("Persona con id: " + i + " eliminata"); 
    } 

    listaPersone = dao.getPersonsList(); // Lista vuota 

    // MOSTRA I DATI DI TUTTE LE PERSONE NELLA LISTA: 
    for(int i=0; i<listaPersone.size(); i++){ 
     Person currentPerson = listaPersone.get(i); 
     System.out.println("id: " + currentPerson.getPid() 
            + " nome: " + currentPerson.getFirstname() 
            + " cognome: " + currentPerson.getLastname());  
    } 

} 
} 

在這個類我想刪除所有表記錄執行週期,只需要這樣的結尾:

dao.delete(listaPersone.get(i).getPid()); 

但不要」噸工作,並在我的表中,所有記錄仍保持不變...

爲什麼?我的代碼有什麼問題? (我也不例外...)

這是我的Person類代碼:

package org.andrea.myexample.HibernateOnSpring.entity; 

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

@Entity 
@Table(name="person") 
public class Person { 

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

private String firstname; 

private String lastname; 

public int getPid() { 
    return pid; 
} 

public void setPid(int pid) { 
    this.pid = pid; 
} 

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; 
} 
} 
+0

可以包括代碼對於Person對象也好嗎? – 2013-02-23 20:24:21

+0

好的,在原來的主題中我添加了人員類代碼 – AndreaNobili 2013-02-23 22:06:45

+0

您是否也可以包含程序的輸出? – 2013-02-24 18:51:25

回答

0

從你的代碼似乎挽救工作,但刪除不。我假設會話與事務同步(事務完成前清除會話)。在delete方法上配置@Transactional應該可以工作。

+0

添加仍然不工作...我已經在原來的主題 – AndreaNobili 2013-02-23 22:08:07

0

我在刪除方法上看不到@Transactional?你有沒有一個

+0

包括人類仍然沒有工作添加...我已經包括人類在原始主題 – AndreaNobili 2013-02-23 22:07:18

+0

爲什麼你不把代碼在github上和我會看看 – JohnNY 2013-02-24 02:48:17

1

你的刪除方法它看起來像什麼? 是否包含@Transaction 這是一個例子:

@Transaction 
public int deleteUser(String userName) { 
    try { 

    //open a session and begin the transaction with the database 
    sessionFactory = HibernateUtil.getSessionFactory(); 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 

    //query the database 
    Query query = session.createQuery("delete from Users u where u.userName ='" + userName +"'"); 
    int result = query.executeUpdate(); 
    session.close(); 

    return result; 
} 

確認您的回報statment之前關閉會話

+1

如果你'beginTransaction()'你不需要'commit()'你的事務??? – KNU 2014-04-06 00:16:37

+0

不,因爲你有@Transactional,現在每個交易都要注意這個註釋;) – wolver 2014-04-14 15:21:35

+0

啊,我從來沒有用過它。這個週末值得測試。 – KNU 2014-04-15 11:08:51

2

我已經解決了這個問題,這樣的:

@Override 
public void deleteData(int id) { 
    log.info("delete by id = "+id); 
    Transaction tx=null; 

    //open a session and begin the transaction with the database 
    Session session = null; 


    try { 
     session = getSession(); 
     tx = session.beginTransaction(); 
     Person person = getPerson(id); 
     session.delete(person);    
     tx.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 

     if (!tx.wasCommitted()) { 
      tx.rollback(); 
     }//not much doing but a good practice 
     session.flush(); //this is where I think things will start working. 
     session.close(); 
    } 
}