Spring Boot JPA, как implenet внешнего ключа между таблицами пользователей и органов власти? - PullRequest
0 голосов
/ 24 августа 2018

Простите, если это очевидный вопрос.

Мое приложение использует проверку подлинности 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)

Это то, что я создал до сих пор:

User.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;
}

Authority.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;
}

UserRepository:

public interface UserRepository extends CrudRepository<User, Long> { }

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Использовать аннотации JPA manyToOne и oneToMany:

User.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;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, orphanRemoval = false)
    private List<Authority> listAuthorities = new ArrayList<>();

}

Authority.java

@Entity
@Data
@Table(name = "authorities", uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
public class Authority {

@Id       
private Long id; 

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user.username")
private User user;

@NotNull
private String authority;
}
0 голосов
/ 24 августа 2018

Если я правильно понимаю, вы хотите, чтобы данные распределялись между двумя таблицами, где идентификаторы были бы общими.Я думаю, что это хорошее использование аннотации @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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...