Spring Boot JPA - отношение "многие ко многим", создающее повторяющиеся записи в одной из таблиц сущностей - PullRequest
0 голосов
/ 05 августа 2020

Мне нужно моделировать классы User и Role ниже -

User.class

@Entity
@Table(name = "t_user")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class User  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;
    private String mobile;
    @Column(unique = true)
    private String email;

    @ManyToMany(targetEntity = Role.class, cascade = {CascadeType.PERSIST, CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH} )
    @JoinTable(
            name="t_user_roles",
            joinColumns=
            @JoinColumn( name="user_id", referencedColumnName="id"),
            inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="id"))
    private List<Role> roles;

Role.class

@Entity
@Table(name = "t_role")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Role  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    @ManyToMany(targetEntity = User.class, mappedBy = "roles", cascade = {CascadeType.PERSIST, CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH})
    private List<User> users;

Теперь, когда я делаю отдельные запросы на публикацию для создания новых пользователей A и B с ролями «user» и «admin» я вижу две записи в таблице «t_user», 4 записи в таблице «t_user_roles» и 4 записи в «t_role» с повторяющимися записями для «пользователь» и «админ». Есть ли способ избежать создания этих повторяющихся записей?

Использование указанных ниже классов контроллера и служб для сохранения объекта User в БД

@RestController
public class UserController{

    @Autowired
    private UserService service;

    @PostMapping("/user/create")
    public User addUser(@RequestBody User user){
        service.createUser(user);
    }
}

public class UserService{

    @Autowired
    private UserRepository userRepository;
    
    public User createUser(User user) {
        userRepository.save(user)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...