По моему опыту, лучший подход - это сначала подумать об объектах и классах, а затем посмотреть, что из этого генерирует hibernate.
Когда вы говорите с точки зрения java, у вас есть множественное наследование (что мало работает с интерфейсами) и мутирующий тип, то есть ваш пользователь сначала становится клерком, а затем потребителем. Не работает таким образом.
Рассмотрим эту модель вместо:
У пользователя есть карта ролевых классов с (подклассами) ролей. Клерк и Потребитель являются ролями. Когда вы разрешаете роли иметь обратную ссылку на пользователя, он может работать как делегат, предоставляя атрибуты и методы, которые есть у каждого пользователя.
В коде это будет выглядеть примерно так:
класс User {
Карта, Роль> ролей;
<T extends Role> T as(<Class<T>> roleClass>){
return (T) roles.get(roleClass);
}
Должен быть красивым, чистым и гибким. И довольно легко сопоставить со схемой базы данных с помощью Hibernate.