1. Transacciones declarativas de primavera
1.1 Gerente de transacciones de Spring
Spring no gestiona directamente las transacciones, pero delega la responsabilidad de administrar las transacciones a las implementaciones de transacciones de una plataforma específica proporcionada por JTA o los mecanismos de persistencia correspondientes. El contenedor de primavera es responsable del funcionamiento de las cosas, el contenedor de primavera actúa como una cara y el método de transacción se llama procesamiento de mejora. El método de objeto proxy generado es el método de destino + mejora, es decir, el programador de transacciones solo usa la operación CRUD, es decir, el método de destino y el método declarado debe ejecutarse en la transacción.
Spring proporciona muchas implementaciones de administrador de transacciones incorporadas:
DataSourCetransactionManager: ubicado en el paquete org.springframework.jdbc.dataSource, el administrador de transacciones de fuente de datos proporciona un solo gestión de transacciones Javax.sql.DataSource, para la gestión de transacciones de Spring JDBC Resumen Framework, Ibatis o MyBatis;
JDotransActionManager: se encuentra en el paquete org.springframework.orm.jdo, proporcionando la gestión de transacciones de un solo javax.jdo.persistencemanagerFactory, para la gestión de transacciones al integrar el marco JDO;
JPATRANSACTIONSManager: se encuentra en el paquete org.springframework.orm.jpa, proporcionando soporte para un solo javax.persistence.eNTITYManagerFactory transacciones, y se utiliza para administrar las transacciones al integrar el marco de implementación de JPA;
HibernateTransactionManager: se encuentra en el paquete org.springframework.orm.Hibernate3, proporcionando soporte para una sola transacción Org.Hibernate.SessionFactory, utilizada para la gestión de transacciones al integrar el marco Hibernate; Este administrador de transacciones solo admite la versión Hibernate3+, y la versión Spring3.0+ solo admite la versión Hibernate 3.2+;
JTATRANSACTIONSManager: se encuentra en el paquete org.springframework.transaction.jta, proporcionando soporte para la gestión de transacciones distribuidas y delegar la gestión de transacciones al administrador de transacciones del servidor de aplicaciones Java EE;
OC4JJTATRANSACTIONSManager: ubicado en el paquete org.springframework.transaction.jta, Spring proporciona un adaptador a OC4J10.1.3+ Aplement Server Transaction Manager. Este adaptador se utiliza para admitir transacciones avanzadas proporcionadas por el servidor de aplicaciones;
WebSphereUowTransactionManager: ubicado en el paquete org.springframework.transaction.jta, Spring proporciona un adaptador para WebSphere 6.0+ Application Server Transaction Manager. Este adaptador se utiliza para admitir transacciones avanzadas proporcionadas por servidores de aplicaciones;
WebLogicJTatransActionManager: ubicado en el paquete org.springframework.transaction.jta, Spring proporciona un adaptador para WebLogic 8.1+ Application Server Transaction Manager. Este adaptador se utiliza para admitir transacciones avanzadas proporcionadas por el servidor de aplicaciones.
Spring no solo proporciona estos administradores de transacciones, sino que también proporciona gerentes para la gestión de transacciones JMS, etc. Spring proporciona una abstracción de transacciones consistente como se muestra en la figura.
primavera e hibernar
ilustrar:
Spring hace algunos preparativos antes de llamar al Administrador de transacciones específico, configurando las políticas de lectura y escritura de la transacción por adelantado, y estas políticas de transacción son cosas públicas y están escritas en el archivo de configuración de Spring. El procesamiento de estos contenidos debe colocarse en una clase abstracta.
2. Procesamiento de transacciones en la integración de la primavera y la hibernación
1.2 Introducción del archivo de configuración de propiedades en formulario XML
<propiedad name = "ubicaciones"> <valor> classpath: jdbc.properties </value> </property>
Configurar la fuente de datos DBCP
<bean id = "dataSource" destruye-method = "cerrar"> <propiedad name = "conductorClassName" value = "$ {jdbc.driverClassname}" /> <propiedad name = "url" value = "$ {jdbc.url}" /> <name de propiedad = "username" valor = "$ {jdbc.username}" /> <name de propiedad = "name" value = "$ {jdbc.password}" /> < /bean>Introducir sessionFactory, usar el archivo de configuración externa de Hibernate
<bean id = "sessionFactory2"> <Property name = "configlocation"> <alon valor> classpath: hibernate.cfg.xml </value> </property> </ bean>
Inyectar DAO y capas de servicio
<Bean id = "Personondao"> <Property Name = "SessionFactory"> <ref Bean = "SessionFactory2"/> </property> </bean> <bean id = "Personservice"> <Property Name = "Personondao"> <ref Bean = "Personondao"/> </Property> </bean>
Configurar el Administrador de transacciones Hibernate
<bean id = "transaccionManager"> <Property name = "sessionFactory"> <ref bean = "sessionFactory2"/> </property> </bean>
Configurar transacciones declarativas
efecto:
1. Dígale al administrador de transacciones de contenedor de primavera
2. Dígale a Spring Container qué método usar qué transacción
<tx: consejo transaccion-ganager = "transaccionManager" id = "tx"> <tx: atributes> <!-Nombre alcance del método de destino islation aislamiento nivel de propagación de propagación de propagación de propagación de propagación atributo de lectura al verdadero lectura </tx: atributos> </tx: consejo>
Configurar el punto de entrada
<aop: config> <aop: pointCut Expression = "Execution (*cn.qjc.Hibernate.service.Impl.*.*(..))" id = "realizar"/> <span style = "white-space: pre"> </span> <!-Aplicar Pointcut al método de mejora-> <aop: asesor de asesor-pref = "Tx" TX "Pointcut-Rf =" Realizar "
clase de implementación de DAO
* Método de implementación 1: Heredar hibernadaosupport * @author qjc */ public class PersondaoImpl extiende Hibernadaosupport implementa Personondao {@Override public void Saveperson (persona persona) }}prueba
...
Aviso:
1. Si una clase DAO hereda HibernatedaSupport, solo necesita inyectar SessionFactory en el archivo de configuración de Spring.
2. Si una clase DAO no hereda HibernatedaSupport, debe tener un atributo de SessionFactory e inyectarlo en el archivo de configuración.
<bean id = "hibernateTemplate"> <Property name = "sessionFactory" ref = "sessionFactory2"> </property> </bean>
1.2 en forma de anotación
1. Aplicar el mecanismo de escaneo automático de Spring en los archivos de configuración
<context: componente-scan base-paquete = "cn.qjc"/>
2. Introducir anotaciones analizadores en el archivo de configuración
<tx: transacción-manager de anotación = "TransactionManager"/>
3. Anotar a través de @Transaction en la capa de servicio
Nota: Si se anota como una transacción de solo lectura a nivel de clase, la configuración de transacción de @Transaction anotada en los métodos de esta clase tendrá prioridad sobre la configuración de transacción del nivel de clase anotado.
1.3 Propiedades de propagación de las transacciones de primavera
Requerido: El método comercial debe ejecutarse en una transacción. Si el método ya está en una transacción cuando se está ejecutando, únase a la transacción, de lo contrario, cree una nueva transacción para usted (predeterminado)
No respaldado: el contenedor de primavera no abre una transacción. Si el método se llama en una transacción, la transacción se suspenderá. Después de finalizar el método, la transacción se restaurará.
Requiere ANEW: Si existe o no una transacción, el método comercial siempre creará una nueva transacción.
Mandatorky: un método comercial solo se puede ejecutar en una transacción existente. Si el método comercial se llama sin una transacción, el contenedor lanza una excepción.
Además, hay propiedades como soportes, nunca, anidados, etc., pero el valor predeterminado generalmente se usa
propagation = "requerido" Esta configuración puede resolver el problema de anidación de transacciones. ¿Qué es la anidación de la transacción?
Por ejemplo:
Hay transacciones en el marco de flujo de trabajo y un determinado método que opera la capa de servicio. La capa de servicio también tiene sus propias transacciones. Cuando se ejecuta el servicio, se producirá la anidación de transacciones, es decir, el método en sí tiene transacciones, y los métodos en el método también tienen transacciones. Esta es la anidación de la transacción. Spring resuelve este problema a través de la propagación del atributo de propagación de la transacción = "requerido".
1.4 OpenInsessionView
Después de la integración S2SH, Spring administra transacciones. Dado que utiliza el método de procesamiento de transacciones declarativo de Spring, la sesión se cierra inmediatamente después de llamar a este. Si hay transacciones en el método ejecutado actualmente, la sesión está cerrada cuando se llama al método del entorno de transacción. Por lo tanto, se generará una excepción cuando el valor se emita en la página.
El método de procesamiento es: modo OpenSessionInview (configurado en Web.xml)
<Tilter> <Sterry-Name> HibernateFilter </filter-Name> <Strofle-Class> org.springframework.orm.Hibernate3.Support.OpensessionInviewFilter </filter-class> <!-SingleSession es verdadero de forma predeterminada. If set to false, it is equal to no OpenSessionInView --> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/PersonService</url-pattern> </filter-mapping>
En el código anterior, podemos ver que al enviar una solicitud, la sesión se ha activado en OpenSessionInview, y la sesión debe cerrarse después de la respuesta, lo que significa que el OpenSessionInview debe ser antes del filtro de Struts2. (Coloque la posición del filtro Struts2 arriba)
Sin embargo, también tiene desventajas para habilitar OpenSessionInview: Debido a que el cierre de la sesión se retrasa y el caché de Hibernate de primer nivel está en la sesión, lo que causará una gran cantidad de datos en caché que permanezcan en la memoria durante mucho tiempo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.