Spring Boot& JPA内部联接2个表

时间:2018-01-23 14:38:45

标签: java jpa spring-boot inner-join

不幸的是,我有一个小的理解问题。 我尝试使用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)

我需要在permissionsMapping表中至少有一个条目的所有项目。

重要的是要说您使用它来登录REST服务OAuth2,因此应该设置Users.ID =当前用户。

项目模型:

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;

}

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 anotation,那么该服务会执行&gt;不再开始,因为它说它错过了标识符。那么我该如何&gt;告诉他桌子上没有主键吗?

我现在如何最好地连接? 在最好的情况下,我获得当前用户的所有项目 在第一步中,许可不会那么重要。重要的是我在permissionsMapping表中获得当前用户有条目的所有项目。

  

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

我意识到这可能是基础知识,但我还不太了解它

任何人都可以向我解释一下吗?

1 个答案:

答案 0 :(得分:0)

您需要使用@EmbeddedId和@Embeddable annonations来定义复合实体和密钥。

@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