Spring создать репозиторий БД для таблицы SQL

У меня есть 2 таблицы в MySql, и я сопоставил их с помощью спящего режима в Spring: пользователи и роли.

Я создал еще одну таблицу: user_roles, но я не знаю, как отобразить ее в спящем режиме.

Вы можете увидеть структуру таблицы ниже:

CREATE TABLE users (
    username varchar(30) NOT NULL,
    email varchar(50) NOT NULL,
    password varchar(255) NOT NULL,
    first_name varchar(40) NOT NULL,
    last_name varchar(40) NOT NULL,
    date_of_birth Date,
    phone_number varchar(20),

    PRIMARY KEY (username)
);

CREATE TABLE roles (
    role_id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(255),
    PRIMARY KEY (role_id)
);

CREATE TABLE user_roles (
    username VARCHAR(30) NOT NULL,
    role_id INTEGER NOT NULL,
    PRIMARY KEY (username, role_id)
);

Вот отображение для таблиц роли:

@Entity
@Table(name = "roles")
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private Integer id;

    private String name;
}

Вот отображение для таблицы пользователи:

@Entity
@Table(name = "users")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {

@Id
@NotEmpty
@Size(min = 5, max = 15)
@Column(name = "username")
private String username;

@Email
@NotEmpty
@Column(name = "email")
private String email;

@NotEmpty
@Size(min = 5)
@Column(name = "password")
private String password;

@NotEmpty
@Size(max = 40)
@Column(name = "first_name")
private String firstName;

@NotEmpty
@Size(max = 40)
@Column(name = "last_name")
private String lastName;

...

}

Я создал POJO для таблицы user_role, но я не знаю, как использовать для него спящий режим, я использую аннотацию @EmbeddedId, но она не работает. Я не знаю, как показать 2 класса выше, что они встраиваемые

@Entity
@Table(name = "user_roles")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserRole implements Serializable {

public UserRole() { }

public UserRole(User username, Role role_id) {
    this.username = username;
    this.role_id = role_id;
}

private static final long serialVersionUID = -2947211066236048069L;

@EmbeddedId
private User username;

@EmbeddedId
private Role role_id;

}

Как я могу сопоставить класс «UserRole» с «user_role» в спящем режиме? Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два разных способа сопоставления таблицы user_roles, я предлагаю первый:

1.

@Entity
@Table(name = "users")
public class User 
{



    @ManyToMany(targetEntity = Role.class)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    @NotAudited
    private Set<Role> roles = new HashSet<>();





}

2.

@Embeddable
public class UserRoleId implements java.io.Serializable
{

    @Column(name = "user_id", nullable = false)
    private long userId;

    @Column(name = "role_id", nullable = false)
    private long roleId;

    public UserRoleId()
    {
    }

    public UserRoleId(long userId, long roleId)
    {
        this.userId = userId;
        this.roleId = roleId;
    }


    //hashcode equal


}

Затем создайте объект.

@Entity
@Table(name = "users_roles")
public class Userroles implements java.io.Serializable
{

    @EmbeddedId
    private UserRoleId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false, insertable = false, updatable = false)
    @NotNull
    private Users users;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "role_id", nullable = false, insertable = false, updatable = false)
    @NotNull
    private Role role;

}

и как я могу определить репозиторий для этого класса? Интерфейс репозитория расширяет JpaRepository <UserRoleId, ???>. Что я должен указать в качестве первичного ключа?

Andrew T 04.11.2018 21:52

Я предполагаю, что это JpaRepository <Userroles, UserRoleId>.

Omid P 05.11.2018 08:48

Другие вопросы по теме