问题
I am quite new in Spring field and in this time I am studying how integrate it with Hibernate to create my DAO object but I am finding some difficulties with the DELETE operation...
So I have a person table and I have create this concrete class that implement my DAO object:
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();
}
}
}
Then I have create a main class to test how my DAO work I have no problem to insert a new object into the dable, to get a single object or a list of all object in the table but I am finding problem to delete an object from the table.
This is my test class:
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());
}
}
}
At the end of this class I am trying to delete all the table record executing a cycle that simply do:
dao.delete(listaPersone.get(i).getPid());
But it don't work and in my table all the record still remain the same...
Why? What is wrong in my code? (I have not exception...)
This is my Person class code:
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;
}
}
回答1:
I have solved this problem like that:
@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();
}
}
回答2:
Your delete method how does it looks like? Does it contains @Transaction That's an example:
@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;
}
Verify that you close your session before return statment
回答3:
From your code it seems that save is working but delete is not. I assume that the session is synchronized with transaction(flushing session before transaction is complete). Placing @Transactional on delete method should work.
回答4:
I don't see a @Transactional on the delete method? do you habe one
来源:https://stackoverflow.com/questions/15044603/spring-hibernate-i-cant-delete-a-record-from-a-table