簡體   English   中英

Spring + Hibernate:我無法從表中刪除記錄

[英]Spring + Hibernate: I can't delete a record from a table

我是Spring領域的新手,在這個時候我正在研究如何將它與Hibernate集成以創建我的DAO對象,但我發現DELETE操作存在一些困難......

所以我有一個人員表,我創建了這個實現我的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();
    }

}

}

然后我創建了一個主類來測試我的DAO如何工作我沒有問題將新對象插入到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;
}
}

我已經解決了這個問題:

@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();
    }
}

你的刪除方法是怎么樣的? 它是否包含@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;
}

確認您在返回身份之前關閉會話

從您的代碼看起來似乎保存工作但刪除不是。 我假設會話與事務同步(在事務完成之前刷新會話)。 @Transactional放在delete方法上應該可行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM