У меня есть две таблицы: User и UserDetails.

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String userName;

private String password;

}


@Entity
public class UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String firstName;

private String lastName;

private String address;

private Date birthday;

@ManyToOne
private User user;

}

Нет геттеров и сеттеров шоу.

Я использую весеннюю загрузку для создания своего приложения. когда я иду на сохранение User, я хочу сохранить эти две таблицы одновременно. Это означает, что сначала сохраняю таблицу User, а затем я сохраняю таблицу UserDetails (для сохранения таблицы UserDetails требуется первичный ключ таблицы User). как я делаю это, используя репозиторий Spring boot JPA? Другое дело, если таблица UserDetails не сохраняется, мы хотим откатить всю нашу транзакцию (это означает, что мы должны откатить пользовательскую таблицу).

Это мой класс услуг

@Service
@Transactional
public class UserDetailsService {
    @Autowired
    private UserDetailsRepository userDetailsRepository;
    @Autowired
    private UserRepository userRepository;
    void saveUserDetails(String userName, String password, String firstName, String lastName,
            String address, Date birthday) {
        User n = new User();
        n.setUserName(userName);
        n.setPassword(password);
        UserDetails ud = new UserDetails();
        ud.setFirstName(firstName);
        ud.setlastName(lastName);
        ud.setAddress(address);
        ud.setBirthDate(birthday);
        userRepository.save(n);
        userDetailsRepository.save(ud);
    }
}
3
Supun Kavinda 5 Авг 2017 в 23:31

1 ответ

Лучший ответ

Вам нужно сделать глупое изменение в своих классах сущностей

  • В User класс добавил поле с соответствующим геттером и сеттером, которое отображается UserDetails

    @OneToMany(mappedBy="user")
    private Collection<UserDetails> userDetails;
    
  • В классе UserDetails добавьте дополнительные аннотации с полем user. нравиться:

    @ManyToOne
    @JoinColumn(name="id")
    private User user;
    

Для отката при неудачной транзакции вы можете добавить аннотацию @Transactional в свой уровень сервиса (где вы вызвали метод .save() или .persists()).

3
sunkuet02 5 Авг 2017 в 23:46
Спасибо за ответ. когда я иду, чтобы сохранить таблицу userDetails, я хочу получить идентификатор таблицы user. но как я получаю идентификатор пользователя. там две таблицы хотят сохранить одну и ту же транзакцию.
 – 
Supun Kavinda
6 Авг 2017 в 00:16
Да, но это не работает. Я думаю, что ошибаюсь внутри класса обслуживания. но я не могу его найти. я указал свой класс обслуживания выше (ниже вопрос)
 – 
Supun Kavinda
6 Авг 2017 в 00:53
1
Спасибо за вашу помощь. я нашел свою ошибку User user = userRepository.save (n); ud.setUser (пользователь);
 – 
Supun Kavinda
6 Авг 2017 в 01:02