This question already has an answer here:
I am quite new in Spring field. I am trying to develop a simple DAO object that implements CRUD operation, but I am having some problem to perform delete and update operation.
I can query the database to correctly obtain a specific object and the list of all objects and create a new record in my table, but if I try to delete or update a record this don't do nothing.
This is the code of my Person class that represents the object to persist in the database:
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;
}
}
And this is my DAO class that implements the CRUD method:
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
*/
@Transactional
public void delete(int id) {
Session session = sessionFactory.openSession();
try {
Person personToDelete = getById(id);
System.out.println("person to delete: " + personToDelete);
session.delete(personToDelete);
} finally {
session.close();
}
}
@Transactional
public void update(Person person){
Session session = sessionFactory.openSession();
try {
System.out.println("UPDATING");
session.merge(person);
} finally {
session.close();
}
}
}
I have created the following main class to test the behavior:
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());
}
Person personUpdate = new Person();
personUpdate.setPid(1);
personUpdate.setFirstname("TEST");
personUpdate.setLastname("TEST");
System.out.println("UPDATE");
dao.update(personUpdate);
}
}
As I previous say: my problem is that if I try to insert a new record in the database work well and work also well if I try to get a specific object having a specific ID or the list of all record
But if I try to delete a record or update a specific record simply don't do nothing!!! Don't throw the exception, but in the table never changed...why?
I think that might depend by the process of opening a new session in any CRUD method that I have implemented but I am absolutely not sure about it...
Can you help me?
Thanks,
Andrea
Hi @AndreaNobili maybe you a mistake code write. You can try something like this:
1.Create an
Person
DTODELETE
2.Query by id for delete apply
UPDATE
3.Query by id for update apply
And you can put
@Transactional
on method DAO Interface.Hope theses helps :)