I figured it out, on PrivateUser class add a annotation @SQLDelete like the following
@SQLDelete( sql="delete user WHERE private_company_id = ? and rel_type = 'private'")
public class PrivateUser extends User {
}
This way I can add cascade delete on OneToMany Relationship of PrivateCompany and PrivateUser, but when cascade kicks in, it executes the query mentioned in SQLDelete annotation giving you control. This approach can also be used if you want to mark a record as inactive instead of deleting it.
Reference: Override default remove()/DELETE in JPA/Hibernate