Pessoal, tenho estava estudando o gerenciamento de transação do spring via annotations e vi que esta criando a transação mas coloquei um propositalmente ocorrer um erro mas a transação nao esta fazendo rollback. A aplicação faz o seguinte, eu faco dois inserts dentro um método que esta com gerenciamento de transação atraves de @transaction onde o primeiro insert ta ok mas propositalmente o segundo da erro de tamanho muito longo da string entao era pra transação dar rollback e nao commitar o
primeiro insert. Mas ele nao esta fazendo isso e o primeiro insert esta sendo comittado.
Uso o HibernateTemplate e abaixo estao os meus fontes de teste.
Abaixo é uma classe com um método main para executar testes apenas p testar esse problema onde propositalmente vai ocorrer um erro no segundo save p ver se da rollback mas isso nao acontece o primeiro save é commitado no banco. O que esta errado?
package teste;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import br2.Pessoa;
import br2.Telefone;
import br2.TipoTelefone;
public class Teste {
/**
* @param args
*/
public static void main(String[] args) {
ClassPathXmlApplicationContext ap = new ClassPathXmlApplicationContext("br2/applicationContext.xml");
Teste t = (Teste) ap.getBean("teste");
t.teste();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void teste()
{
ClassPathXmlApplicationContext ap = new ClassPathXmlApplicationContext("br2/applicationContext.xml");
HibernateTemplate h = (HibernateTemplate) ap.getBean("hibernateTemplate");
TipoTelefone tipoTelefone = new TipoTelefone();
tipoTelefone.setTipo("tipo");
h.save(tipoTelefone);
Pessoa p = new Pessoa();
p.setNome("(aqui vai dar erro de string muito longa)(aqui vai dar erro de string muito longa)");
p.setIdade(25);
h.save(p);//aqui vai ocorrer o erro
}
}
Abaixo é meu applicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
default-autowire="byName"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="sessionFactoryAnnotation"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses" >
<list>
<value>br2.Pessoa</value>
<value>br2.Telefone</value>
<value>br2.TipoTelefone</value>
</list>
</property>
<property name="dataSource" ref="ds"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/teste</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>admin</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactoryAnnotation"/>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactoryAnnotation"/>
</bean>
<bean id="teste" class="teste.Teste"/>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
abaixo estao as minhas entidades mapeadas via annotation
package br2;
// Generated 20/03/2009 18:13:49 by Hibernate Tools 3.2.2.GA
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* Pessoa generated by hbm2java
*/
@Entity
@Table(name = "pessoa", catalog = "teste")
public class Pessoa implements java.io.Serializable {
private Integer idPessoa;
private String nome;
private int idade;
public Pessoa() {
}
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_pessoa", unique = true, nullable = false)
public Integer getIdPessoa() {
return this.idPessoa;
}
public void setIdPessoa(Integer idPessoa) {
this.idPessoa = idPessoa;
}
@Column(name = "nome", nullable = false, length = 30)
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(name = "idade", nullable = false)
public int getIdade() {
return this.idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
}
package br2;
// Generated 20/03/2009 18:13:49 by Hibernate Tools 3.2.2.GA
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* TipoTelefone generated by hbm2java
*/
@Entity
@Table(name = "tipo_telefone", catalog = "teste")
public class TipoTelefone implements java.io.Serializable {
private Integer idTipoTelefone;
private String tipo;
public TipoTelefone() {
}
public TipoTelefone(String tipo) {
this.tipo = tipo;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_tipo_telefone", unique = true, nullable = false)
public Integer getIdTipoTelefone() {
return this.idTipoTelefone;
}
public void setIdTipoTelefone(Integer idTipoTelefone) {
this.idTipoTelefone = idTipoTelefone;
}
@Column(name = "tipo", nullable = false, length = 20)
public String getTipo() {
return this.tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
}
Se alguem poder me ajudar agradeço!