我在Spring领域很新。我正在尝试开发一个实现CRUD操作的简单DAO对象,但是我在执行删除和更新操作时遇到了一些问题。
我可以查询数据库以正确获取特定对象和所有对象的列表,并在我的表中创建新记录,但如果我尝试删除或更新记录,则不执行任何操作。
这是我的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;
}
}
这是我实现CRUD方法的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
*/
@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();
}
}
}
我创建了以下主类来测试行为:
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);
}
}
正如我之前所说的:我的问题是,如果我尝试在数据库中插入新记录工作得很好并且如果我尝试获取具有特定ID的特定对象或所有记录的列表
但是如果我尝试删除记录或更新特定记录,那就什么都不做!不要抛出异常,但在表中从未改变过......为什么?
我认为这可能取决于我已经实施的任何CRUD方法中打开新会话的过程,但我绝对不确定...
你能帮助我吗?
谢谢,
安德烈
答案 0 :(得分:0)
嗨@AndreaNobili也许你写错了代码。你可以尝试这样的事情:
1.创建Person
DTO
删除强>
...
try {
Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.eq("id", personDTO.getId()));
session.delete(personDTO);
} catch(Exception e) { ... }
2.通过id for delete apply
<强>更新强>
try {
Person personDB = (Person) session.get(Person.class, personDTO.getId());
personDB.setName(personDTO.getName());
personDB.setUser(personDTO.getUser());
session.saveOrUpdate(personDB);
} catch(Exception e) { ... }
3.通过id for update apply
您可以将@Transactional
放在方法DAO接口上。
希望这些有助于:)