如何使用Spring启动JpaRepository保存多个表

时间:2017-08-05 20:31:18

标签: java mysql spring spring-mvc spring-boot

我有两个表,分别是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;

}

没有show getters和setter。

我使用spring boot来创建我的应用程序。当我去保存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);
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在实体类中进行愚蠢的更改

  • User中,类添加了一个字段,其中包含由UserDetails

    映射的相应getter和setter
    @OneToMany(mappedBy="user")
    private Collection<UserDetails> userDetails;
    
  • UserDetails课程中,添加一个带有字段user的额外注释。像:

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

要在不成功的交易中回滚,您可以在服务层(您调用@Transactional.save()方法的地方)中添加.persists()注释。