Spring-Boot jpa之联表的增删改查

一、 many to many
以user和role为例,用户可以有多个角色,一个角色也可以有用户。用户和角色是多对多的关系,那么我们还需要一张user_roles表来存储用户和角色的关联。

这边我们以用户一方为关系维持方。

User实体类定义

@Entity
@Table(name = "users")
public class User implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private long id;
	
	private String username;
	private String pwd;

	
	//多对多,关系维护端
	@ManyToMany
	@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "uid"), inverseJoinColumns = @JoinColumn(name = "roleid"))
	private List<Role> roleList;
}

Role实体类

@Entity
@Table(name = "roles")
public class Role implements Serializable {

	@Id
	@GeneratedValue
	private long id;
	private String name;
	private static final long serialVersionUID = 1L;

	@JsonIgnore
	@ManyToMany(mappedBy = "roleList")
	//mappedBy的参数是User类里面的被ManyToMany注释的属性名
	private List<User> userList;
}

注意这里的@JsonIgnore不能忽略,如果没有加这个注释,查询就会陷入死循环,Role要查userList,userList里一个User又要查roleList。
或者,如果不需要通过角色查找用户列表,可以不加userList这个属性。

删除User
删除一个User操作和单表删除一样,调用jpaRepository的delete(long id)就可以,jpa会同时将user_roles表里面该用户的角色关联删除。

删除Role
删除Role要先手动删除user_roles里面的关联,这里涉及到deleteBy的用法,delete默认只能使用主键id进行删除,但是在user_roles里面roleid不是主键,我们要用到deleteBy,使用deleteBy要在方法前面加@Transactional

public interface UserRolesRepository extends JpaRepository<UserRoles, Long> {

	@Transactional
	public void deleteByRoleid(long roleid);
}

然后再删除Role

	public void deleteRole(long id) {
		// TODO Auto-generated method stub
		userRolesRepository.deleteByRoleid(id);
		repository.delete(id);
	}

通过用户id查找用户角色
第一种方法是使用@Query注入sql语句

public interface UserRepository extends JpaRepository<User, Long> {
	@Query(nativeQuery = true, value = "select roles.name from roles, user_roles"
			+ " where user_roles.roleid = roles.id" + " and user_roles.uid = ?1")
	List<String> findUserRolesName(long userid);
}

更推荐使用findBy的方法

public interface RoleRepository extends JpaRepository<Role, Long> {
	public List<Role> findByUserList_Id(long userId);
}

By后面跟UserList代表Role里面的userList属性,’_'代表后面是userList下面的属性id。

上一篇:在 iTunes Connect 中,无法找到“My Apps”选项


下一篇:django-rest-framework(九)(分页)