JPA, как добавить значение типа сущности в Map к первичному ключу? - PullRequest
0 голосов
/ 30 июня 2019

У меня есть 3 класса сущностей, как показано ниже: -

Ролевая сущность

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinTable(name = "roles_privileges", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
    private Set<Privilege> privileges;

    // getters, setters etc

}

Привилегированный субъект

@Entity
public class Privilege {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "privileges", fetch = FetchType.EAGER)
    @JsonIgnore
    private Set<Role> roles;

    // getters, setters etc

}

Объект UrlsMapper

@Entity(name = "urls_mapper")
@Table(name = "urls_mapper")
public class UrlsMapper {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(name = "http_method")
    private HttpMethod httpMethod;

    @Column(name = "path")
    private String path;

    @ManyToMany(fetch = FetchType.EAGER)
    @MapKeyJoinColumn(name = "role_id", referencedColumnName = "id")
    @JoinTable(
        name = "u_r_p",
        inverseJoinColumns = @JoinColumn(name = "privilege_id")
    )
    Map<Role, Privilege> privilegeMap;

   // getters, setters etc

}

Ключи, первичные и внешние, которые создаются, как показано ниже

enter image description here

Журналы во время генерации таблицы, как показано ниже: -

Hibernate: create table u_r_p (urls_mapper_id bigint not null, privilege_id bigint not null, role_id bigint not null, primary key (urls_mapper_id, role_id)) engine=InnoDB
Hibernate: alter table u_r_p add constraint FKgd7gd9f9ded1s28swdudqs0ro foreign key (privilege_id) references Privilege (id)
Hibernate: alter table u_r_p add constraint FKrryprkx4j60lyjti16eysn5g5 foreign key (role_id) references Role (id)
Hibernate: alter table u_r_p add constraint FKfkthdnoca59a18ba96183p7ov foreign key (urls_mapper_id) references urls_mapper (id)

И я просто хочу знать, как я могу также добавить privilege_id в JoinTable u_r_p и есть ли другие лучшие варианты для этого. Ручное выполнение в базе данных является очевидной альтернативой, но я хотел знать решение на основе hbm2ddl.auto, чтобы код сам управлял им

1 Ответ

1 голос
/ 01 июля 2019

Я не думаю, что вы смоделировали свои концепции должным образом.У вас есть ManyToMany между Role и Priviledge, но что делает UrlMapper сущностью?У вас есть поле Map<Role, Privilege> в UrlMapper, но это и есть цель таблицы соединения, поэтому нет необходимости дублировать это.Вместо этого кажется, что HttpMethod и Path являются атрибутами отношений.

enter image description here

Однако я также могу отметить, что вы, кажется,ожидать, что будет соединение Role / Privilege для множества различных комбинаций HttpMethod / Path.Это кажется невероятно мелким и операционным кошмаром, но неважно.В любом случае, вы, похоже, говорите, что вам нужны уникальные комбинации Role / Privilege / HttpMethod / Path, поэтому вам просто нужно создать для этого объект, а таблица представляет ваш набор.Создайте объект разрешения, который содержит уникальную роль / привилегию / HttpMethod / Path.Role, Privilege, HttpMethod и даже Path по сути являются перечислениями, поэтому у вас должна быть таблица для каждого из них с сопоставлениями ManyToOne в сущности Permission.Вы можете добавить двунаправленные сопоставления OneToMany в каждую из таблиц поиска, но я не уверен, что вижу в этом необходимость.Это зависит от вас.

enter image description here

Я предполагаю, что Privilege будет {разрешать, отрицать}, но это кажется менее запутанным, если вы предполагаете отказатьесли специально не существует разрешения Role / HttpMethod / Path.Если это так, то я бы пропустил сущность Privilege.Во всяком случае, просто мысль.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...