Estoy intentando usar Hibernate para insertar en una tabla, pero no funciona y no sé por qué. Estaba ejecutando el script de inserción de sql directamente en postgresql y eso se está ejecutando.

Ese es el mensaje de error:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request
processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: 
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: 
Executing an update/delete query] with root cause

El inserto:

import java.util.List;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

public interface QueryGrupoDeEstudosUsuario extends CrudRepository<EntidadeGrupoEstudoUsuario, Integer>{

    @Modifying
    @Query(value = "insert into grupo_estudo_usuario (id_grupo_estudo, id_usuario, administrador, pedido_pendente) values (3 , 1, false, true)", nativeQuery = true)
    void insereNaTabela(); 
    
}

La clase de entidad:

@Getter
@Setter
@Entity
@Table(name = "grupo_estudo_usuario")
@ToString
public class EntidadeGrupoEstudoUsuario {

    @Id
    @Column(name = "id_grupo_estudo_usuario")
    private Integer idGrupoEstudoUsuario;

    @Getter(AccessLevel.NONE)
    @ManyToOne
    @JoinColumn(name = "id_grupo_estudo")
    private EntidadeGrupoDeEstudos idGrupoDeEstudos;
    
    @ManyToOne
    @JoinColumn(name = "id_usuario")
    private EntidadeUsuario usuario;
    
    @Column(name = "administrador")
    private Boolean administrador;

        
    @Column(name = "pedido_pendente")
    private Boolean pedidoPendente;

    @Column(name = "dt_atz")
    private Date data;


}

El script SQL:

CREATE SEQUENCE public.grupo_estudo_usuario_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;

ALTER TABLE public.grupo_estudo_usuario_id_seq OWNER TO postgres;

CREATE TABLE public.grupo_estudo_usuario (
    id_grupo_estudo bigint NOT NULL,
    id_usuario bigint NOT NULL,
    administrador boolean NOT NULL ,
    pedido_pendente boolean DEFAULT true NOT NULL,
    dt_atz timestamp(0) without time zone,
    id_grupo_estudo_usuario bigint DEFAULT nextval('public.grupo_estudo_usuario_id_seq'::regclass) NOT NULL
);

SELECT pg_catalog.setval('public.grupo_estudo_usuario_id_seq', 14, true);

ALTER TABLE ONLY public.grupo_estudo_usuario
    ADD CONSTRAINT grupo_estudo_usuario_pk PRIMARY KEY (id_grupo_estudo_usuario);

ALTER TABLE ONLY public.grupo_estudo_usuario
    ADD CONSTRAINT grupo_estudo_usuario_fk_1 FOREIGN KEY (id_grupo_estudo) REFERENCES public.grupo_estudo(id_grupo_estudo);

ALTER TABLE ONLY public.grupo_estudo_usuario
    ADD CONSTRAINT grupo_estudo_usuario_fk FOREIGN KEY (id_usuario) REFERENCES public.usuario(id_usuario);

CREATE TRIGGER grupo_estudo_usuario_dt_atz BEFORE INSERT OR UPDATE ON public.grupo_estudo_usuario FOR EACH ROW EXECUTE FUNCTION public.dt_atz();

Cómo estoy usando QueryGrupoDeEstudosUsuario:

@Repository
Public class insereTest {
     @Autowired
     QueryGrupoDeEstudosUsuario query;

     public void insere() {
          query.insereNaTabela();
     }
}
0
Capybara 22 ene. 2021 a las 06:19

1 respuesta

La mejor respuesta

Crea el método de repositorio @Transactional

import java.util.List;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

public interface QueryGrupoDeEstudosUsuario extends CrudRepository<EntidadeGrupoEstudoUsuario, Integer>{
    
    @Transactional
    @Modifying
    @Query(value = "insert into grupo_estudo_usuario (id_grupo_estudo, id_usuario, administrador, pedido_pendente) values (3 , 1, false, true)", nativeQuery = true)
    void insereNaTabela(); 
    
}

La gestión de transacciones debe activarse con la anotación @EnableTransactionManagement en la configuración de la aplicación.

0
alex valuiskyi 22 ene. 2021 a las 06:11