Сущность Spring JPA Assosiation создает ту же запись - PullRequest
1 голос
/ 24 мая 2019

Я устанавливаю Spring Boot Aplication. Пытаюсь сделать make "добавить пользовательское меню", каждый раз, когда я публикую данные JSON, например:

MySQL всегда создает новую запись ADMIN в role_table.

Мое намерение состоит в том, чтобы создать только одну запись администратора в role_table для нескольких пользователей в user_table (от одного до Мэнни)

До сих пор я пытался изменить несколько Spring JPA Annotation для разных видов извлечения,ассоциация и конфигурация.

Пока результат в моей таблице базы данных MySql такой:

role_table.    user_table
id.   role.    id    username  role_id
1    Admin      1    Tony      1
2.   User       2.   Buddy.    2
3.   Guest.     3.   Liaska.   3
4.   Admin      4.   Roy.      5
5.   Admin.     5.   Subrey.   4
6.   User.      6.   Alhanus.  7
7.   Guest      7.   Rsidi.    6

Я ожидал, что результат в моей таблице MySql будет такой:

role_table.    user_table
id.   role.    id    username  role_id
1    Admin      1    Tony      1
2.   User       2.   Buddy.    2
3.   Guest.     3.   Liaska.   3
                4.   Roy.      1
                5.   Subrey.   3
                6.   Alhanus.  1
                7.   Rsidi.    1

Спасибо вам всем

Класс роли такой:

public class Role implements Serializable{


@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="id", length=8, unique = true)
private int id;

@Column(name = "role",nullable = false, unique = false)
private String role;

@OneToMany(mappedBy="role", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
private List<User> user = new ArrayList<User>();}

Класс пользователя такой:

public class User implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="user_id", length=8, unique = true)
private int user_id;

@Column(name = "username", nullable = false, unique = true)
private String username;

@Column(name = "password", nullable = false, unique = true)
private String password;



@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Role role;}

Класс AdminController такой:

public class AdminController {

private static final Logger LOGGER = LoggerFactory.getLogger(AdminController.class);


@Autowired
private UserRepository userRepository;

 @Autowired
  private RoleRepository roleRepository;

 private Role role = new Role();

@Autowired
 private BCryptPasswordEncoder passwordEncoder;

@PreAuthorize("hasAnyRole('ADMIN')")
@PostMapping("/admin/add")
 public String addUserByAdmin(@RequestBody User user){

    String pwd = user.getPassword();

    String encryptedPwd = passwordEncoder.encode(pwd);

    user.setPassword(encryptedPwd);



    if(userRepository.findByUsername(user.getUsername())==null){

        userRepository.save(user);

    } else {

         return "user already exist
    }
    return "user added successfully ... ";


}

1 Ответ

1 голос
/ 24 мая 2019

Проблема связана с инициализацией вашей персистентности role объекта.Здесь вы получаете пользовательский объект в JSON следующим образом:

 {"username": "Frantu", "password": "Pshycho8k8ss", "role" : {"role":"ADMIN"} }

, для которого не инициализировано поле идентификатора для объекта роли.

Таким образом, ваш пользовательский объект будет выглядеть как

User {id=0, username = Frantu, password= Pshycho8k8ss , role = {id=0, role=ADMIN }

Вы не передаете role.id здесь. Таким образом, JPA будет создавать новую запись с новым первичным ключом для каждого нового запроса.

Чтобы решить проблему, сначала получите role из БД, если она есть, используя role атрибут и установите его для объекта пользователя.

Role dbRole = roleRepository.findByRole(user.getRole().getRole());
if(dbRole!=null){
     user.setRole(dbRole);
}

userRepository.save(user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...