Alex Anghel
Alex Anghel

Reputation: 13

Hibernate OneToMany ManyToOne on delete cascade

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.

Upvotes: 0

Views: 323

Answers (2)

Alex Anghel
Alex Anghel

Reputation: 13

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.

Upvotes: 1

Flavio Pernoj
Flavio Pernoj

Reputation: 11

Try like this

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

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

Upvotes: 0

Related Questions