一、 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。