Spring Boot JPA如何实现用户和权限表之间的外键?

sim*_*bro 7 java spring spring-data-jpa spring-boot

如果这是一个显而易见的问题,请原谅我。

我的应用程序使用 LDAP 身份验证,但从其数据库加载用户权限,效果非常好。现在我尝试创建 JPA 实体来通过 REST 接口管理用户和权限。

如何使用 JPA 实现以下架构?

create table users(
    username varchar(50) not null primary key,
    password varchar(50) not null,
    enabled boolean not null
);

create table authorities (
    username varchar(50) not null,
    authority varchar(50) not null,
    constraint fk_authorities_users foreign key(username) references users(username)
);

create unique index ix_auth_username on authorities (username, authority)
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所创建的:

用户.java:

@Entity
@Data
@Table(name = "users", uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
public class User {
    @Id
    @NotNull
    @Column(length=50)
    private String username;

    @NotNull
    private String password;

    @NotNull
    boolean enabled;
}
Run Code Online (Sandbox Code Playgroud)

权威.java:

@Entity
@Data
@Table(name = "authorities", uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
public class Authority {
    @Id
    @NotNull
    @Column(length=50)
    private String username;

    @NotNull
    private String authority;
}
Run Code Online (Sandbox Code Playgroud)

用户存储库:

public interface UserRepository extends CrudRepository<User, Long> { }
Run Code Online (Sandbox Code Playgroud)

use*_*768 0

如果我理解正确的话,您希望数据分布在两个表之间,其中 ID 是共享的。我认为这是@SecondaryTable注释的一个很好的用途。请参阅文档:https://docs.oracle.com/javaee/7/api/javax/persistence/SecondaryTable.html

本质上,您可以使用注释在类级别指定辅助表@SecondaryTable,然后使用 注释应转到该表的任何字段@Column(table="xxx")。在你的例子中authorities是辅助表。所以大致如下:

@Entity
@Data
@Table(name = "users", uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
@SecondaryTables({
    @SecondaryTable(name="authorities")
})
public class User {
    @Id
    @NotNull
    @Column(length=50)
    private String username;

    @NotNull
    private String password;

    @NotNull
    boolean enabled;

    @NotNull
    @Column(table="authorities")
    private String authority;
}
Run Code Online (Sandbox Code Playgroud)