es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿El cascade = CascadeType.ALL en JPA requiere @Transactional al momento de eliminar?

Tengo una entidad de libro:

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

@Entity
@Table(name = "books")
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String author;
    @Column(unique = true)
    private String isbn;

    @OneToMany(mappedBy = "book", fetch = FetchType.LAZY,
            cascade = CascadeType.ALL)
    private Set pages;

    public Book() {
    }

    public Book(String title, String author, String isbn) {
        this.title = title;
        this.author = author;
        this.isbn = isbn;
    }

    // getters and setters, equals(), toString() .... (omitted for brevity)
}

¿Necesito @Transactional en el método del servicio

eliminar(){
    repository.deleteById(book.getId());
}

para asegurarme de que se elimine atómicamente (o se deshaga) el libro y sus páginas?
(Tenga en cuenta cascade = CascadeType.ALL)

Edición: repository es CrudRepository de Spring Data

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, debes anotar el método del servicio con @Transactional para asegurarte de que la eliminación del libro y sus páginas se realice de forma atómica o se deshaga en caso de producirse un error. El atributo cascade=CascadeType.ALL en la anotación @OneToMany de la entidad Book se encargará de eliminar también las páginas asociadas al libro, pero el uso de @Transactional proporcionará soporte transaccional adicional para garantizar consistencia e integridad de datos.

Comments are closed.