1 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2 目录结构
3 代码实现
3.1 配置实体
User.java
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column
private String username;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Role> roleList;
//省略get,set,toString
Role.java
@Entity
public class Role {
@Id
@GeneratedValue
private Long id;
@Column
private String roleName;
@ManyToOne
@JsonBackReference
private User user;
注意在多的一方(@ManyToOne
一方)需要加上@JsonBackReference
,防止返回Json时出现嵌套打印导致栈溢出的问题.
3.2 业务层
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User savaUser(User user) {
for (Role role : user.getRoleList()){
role.setUser(user);
}
return userDao.save(user);
}
}
注意:这里输入的user中包含有role集合,但每个role中不包含用户,需要我们手动set,不然添加完后,role表中的user_id属性是null.
3.3持久层
UserDao.java
public interface UserDao extends JpaRepository<User, Long> {
}
RoleDao.java
public interface RoleDao extends JpaRepository<Role, Long> {
}
其他地方就不展示了.
4 测试
通过postman进行测试
如果user的id存在就是更新,不存在就是添加.
再简单写个根据用户id获取user.
业务逻辑层只有一段.
@Override
public User findUserById(Long id) {
return userDao.findById(id).orElse(null);
}
jpa的findBy是返回一个Optional是用户防止NPE问题(空指针异常)的.这里若为null直接返回null了.
测试下查询.
有时一对多这种关系在对象创建时可能没有具体体现,而是创建后,就和这里用户和权限,在创建角色时,可能不为其添加角色,而是之后去分配角色.(待更新)