私はSpringの世界ではまったく新しく、単純なHibernate DAOを実装しようとしていますが、削除と更新の操作には疑問があります
Spring 3.2.1 と Hibernate 4.1.9 と MySQL データベースを使用しています。
したがって、MySQL データベースには、次の構造を持つpersonという名前のテーブルがあります。
mysql> describe person;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| pid | int(11) | NO | PRI | NULL | auto_increment |
| firstname | varchar(255) | YES | | NULL | |
| lastname | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
私の Spring アプリケーションでは、必要な CRUD 操作を定義した DAO 用に次のインターフェースを定義しました。
package org.andrea.myexample.HibernateOnSpring.dao;
import java.util.List;
import org.andrea.myexample.HibernateOnSpring.entity.Person;
public interface PersonDAO {
public void addPerson(Person p);
public Person getById(int id);
public List<Person> getPersonsList();
public void delete(int id);
public void update(Person person);
}
次に、クラスPersonDAOImplementによってこのインターフェイスを次のように実装しました。
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) {
Person personToDelete = getById(id);
sessionFactory.getCurrentSession().delete(personToDelete);
/*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){
sessionFactory.getCurrentSession().update(person);
/*
Session session = sessionFactory.openSession();
try {
System.out.println("UPDATING");
session.merge(person);
} finally {
System.out.println("CLOSE SESSION");
session.close();
}
*/
}
}
この例は問題なく動作するようです (CRUD メソッドを実行してテーブルに行を挿入し、単一の行または行のリストをクエリし、行を削除し、行を更新するメイン メソッドを含むメイン クラスを使用してテストしました)。行の値)
私が奇妙だと思う唯一のことは、deleteおよびupdateメソッドで正しく機能するには、次の方法でsessionFactory オブジェクトから現在のセッションを取得する必要があることです。
sessionFactory.getCurrentSession().delete(personToDelete);
sessionFactory.getCurrentSession().update(person);
逆に、行を追加またはクエリする必要がある場合は、次のように新しいセッションを開く必要があります。
Session session = sessionFactory.openSession();
なんで?
前のPersonDAOImplクラスでは、削除および更新メソッドの古い実装にコメントしましたが、新しいセッションを開こうとしました (addPerson および query メソッドで問題なく行うように) が、この方法では機能しません...作業現在のセッションを取得した場合にのみ問題ありません
なんで?この DAO オブジェクトの実装は正しいですか?