Home > Software engineering >  Hibernate OneToMany ManyToOne on delete cascade
Hibernate OneToMany ManyToOne on delete cascade

Time:12-04

I'm trying to use Hibernate to map the following relationship:

Each order contains 2 images. When I delete an order I want the images gone as well.

I have two entities, OrderItems and Image and they look like this

public class OrderItems {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    private Long id;

    @Transient
    private String language;

    @OneToMany(fetch = FetchType.EAGER ,orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "order")
    private List<Image> images ;
}

public class Image implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    private Long id;

    @Column(name = "IMAGE_NAME")
    private String name;

    @Column(name = "IMAGE_BYTES", unique = false, nullable = true, length = 1000000)
    private byte[] image;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id" , nullable = false)
    private OrderItems order;
}

Inserting new orders will also insert the coresponding images but when I try to delete an order I get an foreign key constraint error from the tables Image

Am I missing something about Hibernate ? Shouldn't the attribute cascade = CascadeType.ALL do the trick ?

Thanks for taking the time to provide any feedback. Cheers

I already tried OneToMany and ManyToOne unidirectional and bidirectional but I get the same foreign key violation error or my images are not saved at all when I save a new order.

CodePudding user response:

Try like this

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "order_id", nullable = false)

CodePudding user response:

I solved the issue by using Spring to delete an order and automagically it also deleted the images corresponding to that order.

So my first approach of deleting orders by executing sql queries directly on the DB was the issue.

  • Related