I am using Spring Data JPA with Hibernate inside and PostgreSQL and RDBMS. And I created User
class and Role
class. User
can have multiple roles. I want to delete Role
which related to deleted User
so I used
@ManyToMany(cascade = CascadeType.ALL)
, but when I delete user1
in DBInit
related role has not been deleted and I don't know why. Role
class is the owner of relation, so Role
as subordinate class should be deleted too as I use @ManyToMany(cascade = CascadeType.ALL)
. After run()
method in DBInit
executed I have empty users
table and empty users_roles
table as I expected, but roles
table has still has record. So why is that and to to remove cascade Role
when I delete User
? The relation is unidirectional, so I don't need to synchronize anything.
Edit: I use @ManyToMany
relation so using orphanRemoval=true
is not my case. @ManyToMany
annotation doesn't even have orphanRemoval
parameter.
roles table
id | roles |
---|---|
1 | User |
User.java
@Entity
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User
{
@Id
@Getter
@Setter
private String email;
@Getter
@Setter
@ManyToMany(cascade = CascadeType.ALL)
private List<Role> roles;
}
Role.java
@Entity
@Table(name = "roles")
@NoArgsConstructor
public class Role
{
@Id
@GeneratedValue
@Getter
@Setter
private int id;
@Getter
@Setter
String roleName;
public Role(String roleName)
{
this.roleName = roleName;
}
}
UserRepository
@Repository
public interface UserRepository extends JpaRepository<User, String>
{
}
RoleRepository
@Service
public interface RoleRepository extends JpaRepository<Role, Integer>
{
}
DBInit.java
@Service
public class DBInit implements CommandLineRunner
{
@Autowired
private UserRepository userRepository;
@Override
public void run(String[] args)
{
List<Role> roles1 = new ArrayList<>();
roles1.add(new Role("User"));
User user1 = new User("email1@email.com", roles1);
userRepository.save(user1);
userRepository.delete(user1);
}
}
This is my last 3 hibernate queries, so hibernate tried to delete a record from roles
, but something goes wrong
Hibernate:
delete
from
users_roles
where
user_email=?
Hibernate:
delete
from
roles
where
id=?
Hibernate:
delete
from
users
where
email=?