1. Transações declarativas da primavera
1.1 Gerente de transação da primavera
A Spring não gerencia diretamente transações, mas delega a responsabilidade de gerenciar transações para implementações de transações de uma plataforma específica fornecida pelo JTA ou mecanismos de persistência correspondentes. O contêiner de mola é responsável pela operação das coisas, o contêiner de mola atua como uma face e o método de transação é chamado de processamento de aprimoramento. O método de objeto proxy gerado é o método de destino + aprimoramento, ou seja, o programador de transações usa apenas a operação CRUD, ou seja, o método de destino e o método declarado devem ser executados na transação.
A Spring fornece muitas implementações de gerenciador de transações interno:
DataSourCetransActionManager: Localizado no pacote org.springframework.jdbc.datasource, o gerenciador de transações de fonte de dados fornece uma única estrutura de transação Javax.sql.datasource, para o gerenciamento de transações da estrutura de Spring JDBC Abstract, ibatis ou Mybatis;
JDOTRANSActionManager: está localizado no pacote org.springframework.orm.jdo, fornecendo gerenciamento de transações de um único javax.jdo.persistenceManagerFactory, para gerenciamento de transações ao integrar a estrutura JDO;
JpatransactionManager: está localizado no pacote org.springframework.orm.jpa, fornecendo suporte para uma única transação javax.persistence.entityManagerFactory e é usado para gerenciar transações ao integrar a estrutura de implementação de JPA;
HibernateTransactionManager: está localizado no pacote org.springframework.orm.hibernate3, fornecendo suporte para uma única transação org.hibernate.sessionFactory, usada para gerenciamento de transações ao integrar a estrutura de hibernato; Esse gerenciador de transações suporta apenas a versão Hibernate3+ e a versão Spring3.0+ suporta apenas a versão Hibernate 3.2+;
JTATRANSActionManager: está localizado no pacote org.springframework.transaction.jta, fornecendo suporte para gerenciamento de transações distribuídas e delegação de gerenciamento de transações ao gerenciador de transações do Java EE Application Server;
OC4JJTATRANSACTIONMANAGER: Localizado no pacote org.springframework.transaction.jta, o Spring fornece um adaptador para OC4J10.1.3+ Gerenciador de transações do servidor de aplicativos. Este adaptador é usado para oferecer suporte a transações avançadas fornecidas pelo servidor de aplicativos;
WebsphereuowtransactionManager: Localizado no pacote org.springframework.transaction.jta, o Spring fornece um adaptador para o WebSphere 6.0+ Application Server Transaction Manager. Este adaptador é usado para oferecer suporte a transações avançadas fornecidas pelos servidores de aplicativos;
WebLogicjTatransActionManager: Localizado no pacote org.springframework.transaction.jta, o Spring fornece um adaptador ao WebLogic 8.1+ Application Server Manager. Este adaptador é usado para oferecer suporte a transações avançadas fornecidas pelo servidor de aplicativos.
A Spring não apenas fornece esses gerentes de transação, mas também fornece aos gerentes para gerenciamento de transações JMS, etc. O Spring fornece uma abstração de transação consistente, como mostrado na figura.
primavera e hiberna
ilustrar:
A primavera faz alguns preparativos antes de ligar para o gerenciador de transações específico, definir as políticas de leitura e gravação da transação com antecedência, e essas políticas de transação são coisas públicas e são escritas no arquivo de configuração da primavera. O processamento desses conteúdos precisa ser colocado em uma classe abstrata.
2. Processamento de transações na integração da primavera e hibernação
1.2 Introdução ao arquivo de configuração de propriedades em formato XML
<propriedade name = "Localizações"> <Value> ClassPath: jdbc.properties </value> </propriedade>
Configurar fonte de dados DBCP
<bean id = "DataSource" Destro-Method = "Close"> <Propriedade name = "driverClassName" value = "$ {jdbc.driverclassName}" /> <Propriedade Nome = "Url" Value = "$ {Jdbc.url} /> <nome do nome" Username ") value = "$ {jdbc.password}" /> < /bean>Introduce SessionFactory, use o arquivo de configuração externa do hibernato
<bean id = "sessionFactory2"> <Nome da propriedade = "ConfigLocation"> <Value> ClassPath: hibernate.cfg.xml </value> </propriedade> </i bean>
Injetar DAO e camadas de serviço
<bean id = "persondao"> <propriedade name = "sessionFactory"> <ref bean = "sessionFactory2"/> </Property> </bean> <bean id = "persenservice"> <nome da propriedade = "persondao"> <ref Bean = "persondao"/> </propriedade> </bean>
Configure o gerente de transação de hibernato
<bean id = "transactionManager"> <nome da propriedade = "sessionFactory"> <ref bean = "sessionFactory2"/> </Property> </bean>
Configure transações declarativas
efeito:
1. Diga ao gerente de transação de contêineres de primavera
2. Diga ao contêiner da mola que método para usar qual transação
<tx: conselhos transação-manager = "transactionManager" id = "tx"> <tx: atributos> <!-nomes escopo do método de destino islação no nível de isolamento propagação propagação atributo atributo apenas leitura read-som-somente transação Falsa Readwrite transação-> <tx: nome do método "Salvo*" isolation "" </tx: atributos> </tx: conselhos>
Configurar ponto de entrada
<AoP: config> <aop: Pointcut Expression = "Execution (*cn.qjc.hibernate.service.impl.*.*(..))" id = "performa"/> <span style = "white-space: pré"> </span> <!-Aplicar o Método de aprimoramento "<aPrate-ref" </aOP: config>
Classe de implementação DAO
* Método de implementação 1: herde hibernatedaosupport * @author qjc */ classe pública persondaoimpl estende Hibernateaosupport implementa Persondao {@Override public void SavePerson (pessoa pessoa) {this.gethibernatEtemplate (). }}teste
...
Perceber:
1. Se uma classe Dao herda o HibernatedAosupport, você só precisará injetar o SessionFactory no arquivo de configuração do Spring.
2. Se uma classe DAO não herdar o HibernatedAosupport, ela precisará ter um atributo SessionFactory e injetar -o no arquivo de configuração.
<bean id = "hibernateTemplate"> <propriedade name = "sessionFactory" ref = "sessionFactory2"> </propriedade> </bean>
1.2 na forma de anotação
1. Aplique o mecanismo automático de varredura da Spring em arquivos de configuração
<Contexto: componente-Scan Base-Package = "CN.QJC"/>
2. Introduzir um analisador de anotação no arquivo de configuração
<TX: transação orientada por anotação-manager = "transactionManager"/>
3. Anote via @transaction na camada de serviço
NOTA: Se anotado como uma transação somente leitura no nível da classe, as configurações de transação do @Transaction anotadas nos métodos nesta classe terão precedência sobre as configurações de transação do nível de classe anotado.
1.3 Propriedades de propagação das transações de primavera
Necessário: O método de negócios precisa ser executado em uma transação. Se o método já estiver em uma transação quando estiver em execução, entre na transação, caso contrário, crie uma nova transação para você (padrão)
Não suportado: o recipiente de mola não abre uma transação. Se o método for chamado em uma transação, a transação será suspensa. Após o término do método, a transação será restaurada.
RequerNew: se existe ou não uma transação, o método de negócios sempre criará uma nova transação.
Mandatorky: Um método de negócios só pode ser executado em uma transação existente. Se o método de negócios for chamado sem transação, o contêiner lançará uma exceção.
Além disso, existem propriedades como suportes, nunca, aninhados etc., mas o padrão é geralmente usado
propagação = "necessária" Esta configuração pode resolver o problema de nidificação da transação. O que é o ninho de transações?
por exemplo:
Existem transações na estrutura do fluxo de trabalho e um determinado método que opera a camada de serviço. A camada de serviço também possui suas próprias transações. Quando o serviço for executado, ocorrerá o ninho de transações, ou seja, o próprio método possui transações e os métodos no método também possuem transações. Este é o ninho de transações. A Spring resolve esse problema através do atributo de propagação da transação propagação = "Necessário".
1.4 OpenInsessionView
Após a integração do S2SH, a primavera gerencia transações. Como utiliza o método de processamento de transações declarativas da Spring, a sessão é fechada imediatamente após chamar isso.gethibernateTemplate () Método. Se houver transações no método atualmente executado, a sessão será fechada quando o método do ambiente de transação será chamado. Portanto, uma exceção será gerada quando o valor for emitido na página.
O método de processamento é: OpenSessionInView Mode (configurado em web.xml)
<filter> <filter-name> hibernatefilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.openssionInviewFilter </filter-Class> <!-singlessession é verdadeiro por default. Se definido como false, é igual a nenhum openSessionInView-> <Inir-Param> <am-name> singlessession </amam-name> <amam-value> true </amam-value> </irit-param> </filtro> <tril-PAPPERN> <filter-name> hibernateFilter </filter-name> <url-Pattern>/Persstrice>/Persstrice> <filter-name> hibernateFilter </-NAME>
A partir do código acima, podemos ver que, ao enviar uma solicitação, a sessão foi ativada no OpenSessionInView e a sessão deve ser fechada após a resposta, o que significa que o OpenSessionInview deve estar antes do filtro do Struts2. (Coloque a posição do filtro Struts2 acima)
No entanto, também tem desvantagens para ativar o OpenSessionInView: porque o desligamento da sessão está atrasado e o cache de hibernato de primeiro nível está na sessão, o que causará uma grande quantidade de dados em cache na memória por um longo tempo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.