So I've already noticed there is no easy solution to use on delete set null
with JPA, but I heard there may be workarounds.
My problem is the next (it's getting a bit abstract here, but I hope it still makes sense):
Imagine there are employees. Every employee knows their boss, but not the other way around. Bosses are employees themselves.
What I'm trying to accomplish:
If a boss gets fired, everybody who worked under him will lose his boss (obviously).
@Entity
@Table(name = "employee")
public class Employee
{
@Column (name = "id" )
private String id;
@OneToOne
@JoinColumn( name = "boss" )
private employee boss;
}
This is how it worked in SQL:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT CONSTRAINTNAME FOREIGN KEY (BOSS)
REFERENCES EMPLOYEE (ID)
ON DELETE SET NULL;
I don't want people without a boss to get fired as well, I just want them to lose their reference to their former boss. I saw solutions using @PreRemove but I am unsure if this does the same as I intend to.
thanks in advance!
Yes @PreRemove()
is a good way to go.
But you need to have the bidirectional association on the inverse side, meaning Employee
should have a @OneToMany
with Employee
(employees under supervision). And then add this method in Employee
:
@PreRemove
private void removeAssociationsWithChilds() {
for (Employee e : employees) {
e.setBoss(null);
}
}
But, if you don't want to keep track on the inverse side, meaning if you don't want to have a list of employees under supervision by the boss using @OneToMany
, then you will have to do it manually via HQL just before deletion, such as update Employee e set e.boss = null where e.boss = ?
, and then delete the boss.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With