1
resposta

EntityManager.getTransaction().roolback não funciona jpa java

Ao inserir o cliente 2 e gerado uma exception: Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2' for key 'Cliente.UK_a8p0pxvka1kuwy5y09omepofx' como esperado, so que o transação não chega a ser commitada porem o cliente 1 é inserido no banco deveria acontecer um rollback, alguem consegue me ajudar ?

obs: estou utilizando groovy na linguagem com a stack de java.

class TesteContaCliente {

static void main(String[] args) {
    JPAUtil jpa = new JPAUtil()

    Cliente cliente = new Cliente(nome: "Leonardo", endereco: "Rua Fulano, 123", profissao: "Professor")
    Cliente cliente2 = new Cliente(nome: "Douglas", endereco: "Rua Fulano, 123", profissao: "Professor")
    Conta conta = new Conta()
    conta.setId(2)
    cliente.setConta(conta)
    cliente2.setConta(conta)

    EntityManager em = jpa.createEntityManager()
    EntityTransaction etx = em.getTransaction()
    etx.begin()


    em.persist(cliente)
    em.persist(cliente2)



    etx.commit()
    em.close()
}

}

pom.xml :

    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.1.Final</version>
    </dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>

    persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"

<persistence-unit name="financas" transaction-type="RESOURCE_LOCAL">


    <provider> org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/java-jpa?allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=UTF-8" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="123456" />
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.connection.autocommit" value="false"/>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />

    </properties>
</persistence-unit>

1 resposta

Olá, Osmar!

Acredito que o problema esteja relacionado ao fato de que você não está tratando a exceção que está sendo lançada.

No seu código, você está tentando persistir dois clientes com a mesma conta, o que está gerando uma exceção de violação de integridade. Para fazer o rollback da transação quando ocorrer essa exceção, você precisa capturá-la e chamar o método rollback().

Aqui está um exemplo de como você pode fazer isso:

try {
    em.persist(cliente)
    em.persist(cliente2)
    etx.commit()
} catch (Exception e) {
    if (etx != null && etx.isActive()) {
        etx.rollback()
    }
    e.printStackTrace()
} finally {
    em.close()
}

Neste exemplo, se ocorrer uma exceção durante a persistência dos clientes ou o commit da transação, o bloco catch será executado. Dentro do blocko catch, verificamos se a transação está ativa e, em caso afirmativo, fazemos o rollback. Depois disso, imprimimos a pilha de exceções para depuração. O bloco finally garante que o EntityManager será fechado, independentemente de uma exceção ter ocorrido ou não.

Espero ter ajudado e bons estudos!