Как видно из приведенного выше экрана, пользователю может быть назначено более одной роли. т.е. 1 пользователь может быть сопоставлен с несколькими ролями, а 1 роль может быть сопоставлена с несколькими пользователями.
Следовательно, отношения между пользователем и ролью - многие ко многим. третья таблица, которая называется таблицей сопоставления.
Итак, в вашем примере у нас есть следующие таблицы: -
user
user_roles
role
@Entity
@Table(name = "user")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
@Id
@SequenceGenerator(name = "USER_ID_GENERATOR", sequenceName = "USER_SEQ",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_ID_GENERATOR")
@Column(name = "user_id")
private Long userId;
@OneToOne
@JoinColumn(name = "persion_id")
private person person;`
enter code
here`
@Basic
@Column(name = "date")
private Date date;
@Basic
@Column(name = "observations")
private String observations;
@Basic
@Column(name = "text")
private String text;
@JsonIgnore
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserRoles> users = new ArrayList<>();
}
@ Entity @Table (name = "role") @JsonInclude (JsonInclude.Include.NON_NULL) publi c class Role {
@Id
@SequenceGenerator(name = "ROLE_ID_GENERATOR", sequenceName = "ROLE_SEQ",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ROLE_ID_GENERATOR")
@Column(name = "role_id")
private Long roleId;
@Basic
@Column(name = "id1")
private Long idOne;
@Basic
@Column(name = "id1")
private Long idTwo;
@Basic
@Column(name = "id1")
private Long idThree;
@Basic
@Column(name = "text")
private String text;
@JsonIgnore
@OneToMany(mappedBy = "role", cascade = CascadeType.ALL)
private List<UserRoles> users = new ArrayList<>();
}
@ Entity @Getter @Setter @Table (name = "user_roles") @JsonInclude (JsonInclude.Include.NON_NULL) @Audited publi c класс UserRoles {
private static final long serialVersionUID = 1L;
@EmbeddedId
UserRolesKey userRoleId;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("role_id")
@JoinColumn(name = "role_id")
Roles role;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("user_id")
@JoinColumn(user_id)
User user;
@PrePersist
private void prePersist() {
super.onPrePersist();
if (this.getId() == null) {
UserRolesKey mapKey = new UserRolesKey();
mapKey.setRoleId(this.getRole().getRoleId());
mapKey.setUserRoleId(this.getUser().getUserId());
this.setId(mapKey);
}
}
}
При сохранении вам просто нужно заполнить объект пользователя всеми объектами сопоставления uaerRoles и сохранить его. jpa сохранит все детали.
при обновлении роли, назначенной пользователю, вам необходимо получить сущность пользователя и обновить сопоставление, добавив новую сущность userRoles и аннулировав время, которое будет удалено.