2009-04-16 31 views
11

Khung làm việc mùa xuân đi bao xa với xử lý giao dịch? Việc đọc cuốn sách "Spring In Action" gợi ý rằng bạn tạo các phương thức DAO mà không lo lắng về việc quản lý Session và Transaction khá đơn giản bằng cách thiết lập một nhà máy phiên và mẫu giao dịch trong XML và sau đó nối chúng vào DAO của bạn. Tài liệu của SpringSource.org, mặt khác, gợi ý rằng cần tấn XML và/hoặc chú thích để thực hiện điều này.Quản lý giao dịch Hibernate tự động với Spring?

sự thật ở đây, cách đơn giản nhất tôi có thể lấy mã dọc theo dòng của

get session from sessionfactory 
open transaction 
preform database actions 
commit transaction with error handling 

và làm cho nó chỉ

preform database actions 

giảm số lượng mã giao dịch tấm nồi hơi là gì là gì mà Tôi có phương pháp của tôi ở mức tối thiểu?

Trả lời

10

Spring cung cấp ít nhất 3 cách phân giới cắm mốc giao dịch:

1) xử lý theo chương trình, qua TransactionTemplate hoặc PlatformTransactionManager - ánh sáng trên cấu hình, nhưng xâm lấn

2) Declarative qua XML - XML ​​tiết, nhưng không xâm lấn

3) Declarative qua chú thích - ánh sáng trên XML, không xâm lấn

mà một trong những bạn chọn phụ thuộc vào cái nào phù hợp nhất với nhu cầu của bạn, mùa xuân không làm cho sự lựa chọn đó cho bạn . Từ câu hỏi của bạn, có vẻ như cách tiếp cận chú thích là những gì bạn đang theo dõi.

Tôi khuyên bạn nên đọc hướng dẫn tham khảo Mùa xuân, phần xử lý giao dịch theo chú thích. Nó rõ ràng và súc tích.

Tôi luôn tham khảo tài liệu ref trước và chỉ tham khảo sách nếu sách đó không có trong tài liệu.

11

Có một số công việc bạn phải làm để có thể làm điều đó nhưng không hề nhiều. Giả sử, bạn sẽ sử dụng JPA để chọn nhà cung cấp của riêng bạn, ví dụ: Hibernate. Sau đó, bạn cần phải đặt persistence.xml định nghĩa các đơn vị bền vững trong thư mục META-INF:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 
    <persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>   
</persistence> 

Tiếp theo, xác định tất cả mọi thứ cần thiết cho việc kết nối cơ sở dữ liệu trong bối cảnh ứng dụng Spring bạn sử dụng, tối thiểu nó nên chứa sau đây:

<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>/WEB-INF/jdbc.properties</value>  
     </property> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close" scope="singleton"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="database" value="POSTGRESQL" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/> 
       <property name="showSql" value="true"/> 
       <property name="generateDdl" value="false"/> 
      </bean> 
     </property>  
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

Một số thuộc tính ở trên có thể được thay đổi hoặc bổ sung tùy theo nhu cầu của bạn. Ví dụ này dành cho JPA với cơ sở dữ liệu Hibernate và PostgreSQL như bạn có thể đoán.

Bây giờ bạn chỉ có thể xác định phương pháp truy cập dữ liệu của bạn như thế này:

@Repository 
@Transactional 
public class UserJpaDAO { 

    protected EntityManager entityManager; 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    public void save(User theUser) { 
     entityManager.persist(theUser); 
    } 

    public User update(User theUser) { 
     return entityManager.merge(theUser); 
    } 
} 

nơi tài là một thực thể JPA xác định bởi ứng dụng của bạn. Bạn có thể quản lý các giao dịch tại tầng quản lý/điều khiển gọi các DAO của bạn - thực ra tôi làm theo cách đó - nhưng tôi đã đặt nó lại với nhau ở đây không để làm ví dụ lộn xộn quá nhiều.

Tài liệu tham khảo hay mà bạn có thể muốn chuyển thẳng đến thay vì ví dụ của tôi là http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html 3 liên kết hàng đầu mà tài liệu tham chiếu của tài liệu tham khảo cũng đáng giá.

+0

Cảm ơn câu trả lời, tôi sẽ chơi với ngày mai này tại nơi làm việc. Tuy nhiên, cả hai liên kết của bạn ở cuối đều giống nhau. –

+0

xin lỗi, nhưng liên kết tôi đã cung cấp chứa 3 liên kết khác bao gồm cả liên kết khác mà tôi đã lưu ý ... – topchef

+0

Liên kết này hiện xuống ... –

Các vấn đề liên quan