Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA,如何将映射中实体类型的值添加到主键?_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

Java JPA,如何将映射中实体类型的值添加到主键?

Java JPA,如何将映射中实体类型的值添加到主键?,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我有3个实体类,如下所示:- 角色实体 我只想知道如何将特权id也添加到可连接的u_r_p中,以及是否有其他最佳选择。在数据库中手动执行是一种明显的替代方法,但我想知道基于hbm2ddl.auto的解决方案,以便代码能够自行管理它我认为您没有正确地建模概念。在Role和Priviledge之间有manytomy,但是是什么让UrlMapper成为一个实体呢?在UrlMapper中有一个Map字段,但这是连接表的目的,因此不需要重复该字段。相反,HttpMethod和Path似乎是关系的属性 但

我有3个实体类,如下所示:-

角色实体


我只想知道如何将特权id也添加到可连接的u_r_p中,以及是否有其他最佳选择。在数据库中手动执行是一种明显的替代方法,但我想知道基于hbm2ddl.auto的解决方案,以便代码能够自行管理它

我认为您没有正确地建模概念。在
Role
Priviledge
之间有
manytomy
,但是是什么让
UrlMapper
成为一个实体呢?在
UrlMapper
中有一个
Map
字段,但这是连接表的目的,因此不需要重复该字段。相反,
HttpMethod
Path
似乎是关系的属性

但是,我可能还注意到,您似乎希望对许多不同的HttpMethod/Path组合有一个角色/权限连接。这似乎是难以置信的细粒度和操作噩梦,但无论如何。无论如何,您似乎想说的是您需要角色/特权/HttpMethod/Path的唯一组合,因此您应该为其创建一个实体,并且该表表示您的集合。创建具有唯一角色/权限/HttpMethod/Path的权限实体。角色、权限、HttpMethod甚至路径本质上都是枚举,因此您应该为它们中的每一个都有一个表,在权限实体中有
manytone
映射。您可以在每个查找表中添加双向
OneToMany
映射,但我不确定是否需要这样做。这取决于你


我假设
Privilege
应该是{allow,deny},但是如果您假设deny,那么看起来就不那么麻烦了,除非角色/HttpMethod/Path权限确实存在。如果是这种情况,那么我将省略
特权
实体。总之,只是一个想法。希望这能有所帮助。

非常感谢您提供了如此详尽的答案,并且非常清楚地理解了它。我把它换成了一张桌子,桌上摆满了一大堆无需担心的事。此外,您需要在权限实体中有
manytone
映射,这可能就是您所需要的全部。请参见编辑。应该不需要双向关系,但这取决于你。是的,很多人,请看这里->
@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

}
@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

}
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)