私は春のフィールドではまったく新しいです。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メソッドで新しいセッションを開くプロセスに依存する可能性があると思いますが、それについてはまったくわかりません...
手伝って頂けますか?
ありがとう、
アンドレア