不幸的是,我有一个小的理解问题。 我尝试使用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或......
我意识到这可能是基础知识,但我还不太了解它
任何人都可以向我解释一下吗?
答案 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. EmbeddedId2. Embeddable