【问题标题】:Spring Boot & JPA inner Join of 2 Tables2表的Spring Boot和JPA内连接
【发布时间】:2018-01-23 14:38:45
【问题描述】:

不幸的是,我有一个小的理解问题。 我正在尝试使用 JPA 通过 2 个表创建内部联接。

情况:

Table: Projects
Fields:
ID (PK)
Name

Table: Users
Fields:
ID (PK)
username
password

Table: permissions
Fields:
ID (PK)
permissionName

Table: permissionsMapping (NO PK)
project_id (FK => projects.ID
user_id (FK => users.ID)
permission_id (FK => permissons.ID)

我需要所有在权限映射表中至少有一个条目的项目。

重要的是要说您正在使用它来登录 REST 服务 OAuth2,因此应设置 Users.ID = Current User。

项目模型:

public class ProjectModel
{
@Column(name = "ID",  nullable = false)
private long ID;
@Column(name = "Name",  nullable = false)
private String Name;
enter code here
@OneToMany(cascade=CascadeType.ALL, targetEntity=PermissionsMappingModel.class)
private Set<PermissionsMappingModel> permissionsMapping;

}

权限映射模型:

public class PermissionsMappingModel
{
@Column(name = "project_id",  nullable = false)
private long project_id;
@Column(name = "user_id",  nullable = false)
private long user_id;
@Column(name = "permission_id",  nullable = false)
private long permission_id;
}

问之间 如果我不在权限映射中使用@Id 注释,则服务不会 > 不再启动,因为它说它错过了标识符。那么我该如何 > 告诉他该表没有主键?

我现在如何最好地连接它? 在最好的情况下,我得到当前用户的所有项目 在第一步中,许可不会那么重要。获取权限映射表中当前用户的条目的所有项目非常重要。

正如我所描述的,我收到以下错误: 引起:org.hibernate.AnnotationException:非法尝试映射 非集合为 @OneToMany、@ManyToMany 或 ...

我意识到这可能是基础,但我还不太明白

谁能给我解释一下?

【问题讨论】:

    标签: java jpa spring-boot inner-join


    【解决方案1】:

    您需要使用@EmbeddedId 和@Embeddable 注释来定义您的复合实体和键。

    @Data @Entity @Table(name="Projects")
    public class Projects {
    
        @Id
        private Long projectId;
        private String projectName;
    
        @OneToMany(mappedBy = "mappingId.projectId")
        private Set<PermissionMapping> permissionMappings = new HashSet<PermissionMapping>();
    
    }
    
    @Data @Entity @Table(name="Users")
    public class Users {
    
        @Id
        private Long userId;
        private String userName;
        private String password;
    }
    
    @Data @Entity @Table(name="Permissions")
    public class Permissions {
    
        @Id
        private Long permissionId;
        private String permissionName;
    }
    
    @Data @Entity @Table(name="PermissionMapping")
    public class PermissionMapping {
    
        @EmbeddedId
        private PermissionMappingId mappingId;
    
        @Embeddable
        @Data
        public static class PermissionMappingId implements Serializable{
    
            private Long projectId;
            private Long userId;
            private Long permissionId;
        }
    }
    

    更多阅读:

    1.EmbeddedId 2.Embeddable

    【讨论】:

    • 看起来好多了!但是权限映射中的条目是空的:{ "projectID": 2, "projectName": "SampleProject", "PermissionMapping": [ {}, {} ] },那会是什么?
    • 好吧,忘记我的最后一个问题,我忘记了 getter 和 setter,所以这不起作用。现在我只需要集成用户 ID。但这必须由 OAuth 查询。
    • 您需要为 OAuth 集成 Spring 安全性。一个很好的例子是 github.com/rajithd/spring-boot-oauth2
    • 我的 oAuth 正在工作,这不是问题,我现在只需要一种方法来安装当前登录的用户作为过滤器。
    • 我可以想象这样的事情:@OneToMany(mappedBy = "mappingId.projectId & mappingid.userid =@currentUser")