Hibernate: как объединить 3 таблицы в одну таблицу соединений по аннотации?

У меня есть несколько ролей, пользователей и приложений, которые я хочу создать для этой таблицы в спящем режиме:

CREATE TABLE role_application_user (
  role_identifier INTEGER not null,
  application_identifier INTEGER not null,
  user_identifier INTEGER not null,
  KEY FK_role_identifier (role_identifier),
  KEY FK_application_identifier(application_identifier),
  KEY FK_user_identifier (user_identifier),
  CONSTRAINT FK_role_identifier FOREIGN KEY (role_identifier) REFERENCES role (identifier),
  CONSTRAINT FK_application_identifier FOREIGN KEY (application_identifier) REFERENCES application (identifier),
  CONSTRAINT FK_user_identifier FOREIGN KEY (user_identifier) REFERENCES users (login)
);

для приложения у роли может быть много пользователей, а у пользователя может быть много ролей.

Я пробую это сопоставление:

Приложение.java

@JoinTable(name = "role_application_user",
           joinColumns = @JoinColumn(name = "application_identifier"),
           inverseJoinColumns = @JoinColumn(name = "user_identifier"))
@MapKeyJoinColumn(name = "role_identifier")
@ElementCollection
private Map<Role, User> userByRole = new HashMap<>();

К сожалению, в моем случае это не работает, потому что в java ключ карты должен быть уникальным.

При таком отображении у нас может быть только один пользователь для роли и приложения.


person Florian Mousseau    schedule 26.07.2016    source источник
comment
Вот ваш ответ developer.jboss.org/thread/168634?tstart=0   -  person Sitansu    schedule 26.07.2016
comment
у тебя есть решение?   -  person Rajeshkumar    schedule 22.07.2017


Ответы (1)


попробуйте эту реализацию:

    @Entity
    public class User {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }
    
    @Entity
    public class Role {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }
    
    @Entity
    public class RoleInApplication {
        @ManyToOne
        private User user;
        @ManyToOne
        private Role role;
        @ManyToOne
        private Application application;
    }
    
    @Entity
    public class Application {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }
person Mohamed Nabli    schedule 26.07.2016
comment
Этот в порядке. Но это позволяет дублировать объект RoleInApplication. Как это предотвратить? - person Rajeshkumar; 06.08.2017
comment
Вы пробовали использовать составной ключ в RoleInApplication? @Раджеш - person Mohamed Nabli; 07.08.2017
comment
Да Бро. Я так сделал и ок. - person Rajeshkumar; 08.08.2017