关于Spring的一些说明@Transactional方法的注释
我在Spring世界中是新手,我开发了一个简单的项目,使用Spring 3.2.1和Hibernate 4.1.9来实现DAO。该项目工作正常,但我对使用@Transactional Spring注释来说明这个DAO的CRUD方法有一些疑问。
这是实现我的项目的 CRUD 操作的类的整个代码:
package org.andrea.myexample.HibernateOnSpring.dao;
import java.util.List;
import org.andrea.myexample.HibernateOnSpring.entity.Person;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.springframework.transaction.annotation.Transactional;
public class PersonDAOImpl implements PersonDAO {
// Factory per la creazione delle sessioni di Hibernate:
private static SessionFactory sessionFactory;
// Metodo Setter per l'iniezione della dipendenza della SessionFactory:
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/** CREATE CRUD Operation:
* Aggiunge un nuovo record rappresentato nella tabella rappresentato
* da un oggetto Person
*/
@Transactional(readOnly = false)
public Integer addPerson(Person p) {
System.out.println("Inside addPerson()");
Session session = sessionFactory.openSession();
Transaction tx = null;
Integer personID = null;
try {
tx = session.beginTransaction();
personID = (Integer) session.save(p);
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return personID;
}
// READ CRUD Operation (legge un singolo record avente uno specifico id):
public Person getById(int id) {
System.out.println("Inside getById()");
Session session = sessionFactory.openSession();
Transaction tx = null;
Person retrievedPerson = null;
try {
tx = session.beginTransaction();
retrievedPerson = (Person) session.get(Person.class, id);
tx.commit();
}catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return retrievedPerson;
}
// READ CRUD Operation (recupera la lista di tutti i record nella tabella):
@SuppressWarnings("unchecked")
public List<Person> getPersonsList() {
System.out.println("Inside getPersonsList()");
Session session = sessionFactory.openSession();
Transaction tx = null;
List<Person> personList = null;
try {
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Person.class);
personList = criteria.list();
System.out.println("personList: " + personList);
tx.commit();
}catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return personList;
}
// DELETE CRUD Operation (elimina un singolo record avente uno specifico id):
public void delete(int id) {
System.out.println("Inside delete()");
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Person personToDelete = getById(id);
session.delete(personToDelete);
tx.commit();
}catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
@Transactional
public void update(Person personToUpdate) {
System.out.println("Inside update()");
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
System.out.println("Insite update() method try");
tx = session.beginTransaction();
session.update(personToUpdate);
tx.commit();
}catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
好的,正如你所看到的,一些方法是使用@Transactional注释来注释的。
我在这里阅读了关于在方法上使用这个注释的官方文档,http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html,它看到:使用@Transactional注释的方法必须具有事务语义,但它对事务语义意味着什么?
这是否意味着必须将methos执行视为交易的执行?因此,这意味着必须将方法操作视为可能导致成功或失败的单个操作,如果成功,则操作的结果必须是永久性的,而在未能返回到事务开始之前的状态的情况下。
这是使用方法@Transactional注释的含义吗?
在addPerson()方法的@Transactional注释中,readOnly = false属性究竟是什么意思?这意味着我也可以在数据库中写入记录(而不仅仅是读取它)还是什么?这个疑问是相关的,因为我已经明白,默认情况下,使用@Transactional注释定义的事务是读/写的,而不仅仅是读...我还尝试删除(readOnly = false)属性,并且仍然工作良好(在数据库表中插入新记录)
下面的dut是:“为什么某些方法使用@Transactional注释而其他一些方法不使用?用@Transactional注释所有CRUD方法是否是一个好主意?
断续器
安德里亚