我在Spring世界很新,我開發了一個使用Spring 3.2.1和Hibernate 4.1.9實現DAO的簡單項目。該項目正常工作,但我對使用此DAO的CRUD方法的Spring註釋使用@Transactional表示懷疑。關於Spring @Transactional註解的一些說明方法
這是實現我的項目的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註解annoted。
我在這裏http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html有關使用此批註的方法看書的官方文檔,它看到:使用@事務必須有事務語義,但它與事務語義意味着的方法annoted?
這意味着methos執行必須被視爲執行事務嗎?因此,這意味着方法操作必須被視爲可能導致成功或失敗的單一操作,如果成功,操作的結果必須是永久性的,而如果失敗返回到之前的狀態交易的開始。
這是使用的含義@Transactional註解的方法?
什麼恰恰意味着在addPerson的()方法的@Transactional註解的readOnly的= FALSE屬性?這意味着我也可以在數據庫中寫入記錄(而不僅僅是讀取它)或什麼?這個疑問是相關的,因爲我明白,默認情況下,使用@Transactional註釋定義的交易是讀取/寫入而不只是讀取... 我也嘗試刪除(readOnly = false)屬性和仍然工作正常(在數據庫表中插入新記錄)
以下dout是:「爲什麼某些方法使用@Transactional註釋和其他一些方法進行註釋?是否使用@ @來標記所有CRUD方法是一個很好的實踐,交易?」
TNX
安德烈
我猜你的交易配置無效,因爲你可以插入一些只讀事務。我的猜測是,你根本不使用交易。請詳細介紹一下您如何配置交易環境(appcontext)。 也不要在DAO級別聲明您的事務,而是在業務級別(您實際使用DAO的地方)聲明您的事務。 – 2013-03-08 18:20:49