2016-07-26 6 views
1

У меня есть несколько ролей, пользователи и приложения Я хочу создать отображение в спящий режим из этой таблицы: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) 
); 

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

Я стараюсь это отображение:

Application.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, ключ от карты должен быть уникальным.

С помощью этого сопоставления у нас может быть только один пользователь для роли и приложения.

+0

Вот ваш ответ https://developer.jboss.org/thread/168634?tstart=0 – Sitansu

+0

вы получили решение? – Rajesh

ответ

0

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

@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; 
} 
+0

Это нормально. Но он позволяет дублировать объект RoleInApplication. Как это предотвратить? – Rajesh

+0

Вы пытались с помощью сложного ключа в RoleInApplication? @Rajesh –

+0

Да Бро. Я сделал это так и хорошо. – Rajesh