У меня есть 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» в спящем режиме? Спасибо!




Есть два разных способа сопоставления таблицы 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 <Userroles, UserRoleId>.
и как я могу определить репозиторий для этого класса? Интерфейс репозитория расширяет JpaRepository <UserRoleId, ???>. Что я должен указать в качестве первичного ключа?