简体   繁体   中英

Spring Data JPA: delete OneToMany child without going through the parent

My application has a Project entity that has set of Resource entities like this:

@Entity
public class Project {
    @OrderBy("name ASC")
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = false)
    @Column(name = "resources")
    private Set<Resource> resources;
}

The Resource entities may be referenced by several projects, and I'm wondering how to delete a Resource from the database easily without first removing it from the resources list of each parent Project . Trying to delete the resource directly using the repository's deleteById method results in a foreign key constraint violation if the Resouce in question is referenced in one or more projects.

Edit: the database schema has a table called project_resources which maps resource IDs to project IDs.

Based on your question it seems there is a many-to-many relation between the Project and Resource tables. And based on your entity I assume on the database level there is no join table, but every Project has a Resource reference (FK) and vica versa.

Assuming this if you want to delete a resource, first you have to delete all references to it. You could execute a native update like this:

update Project set resource_id = null where resource_id = :resourceIdToBeDeleted;

After this, you can delete the resource.


If my assumption is wrong, and you still have a join table, then you have to delete rows from the join table. Something like this:

delete from Project2Resource where resource_id = resourceIdToBeDeleted;

After this, you can delete the resource.

In this scenario you could also model your join table with an entity, like Project2Resource and delete these entities with spring query method ( deleteByResourceId(long id) ) before the resource deletion.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM