我在 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 应用程序中,我为我的 DAO 定义了以下接口,该接口定义了所需的 CRUD 操作:
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 方法在表中插入行,查询单行或行列表,删除一行并更新连续值)
我唯一觉得奇怪的是,要在删除和更新方法中正常工作,我必须以这种方式从我的 sessionFactory 对象中获取当前会话:
sessionFactory.getCurrentSession().delete(personToDelete);
sessionFactory.getCurrentSession().update(person);
相反,当我必须添加或查询一行时,我必须以这种方式打开一个新会话:
Session session = sessionFactory.openSession();
为什么?
在之前的PersonDAOImpl类中,我已经评论了删除和更新方法的旧实现,我试图打开一个新会话(就像我在 addPerson 和查询方法中所做的那样没有问题)但是这样不起作用......工作仅当我获得当前会话时才可以
为什么?DAO 对象的这个实现是否正确?