美文网首页
【JPA】联表的增删改查(一)many to many

【JPA】联表的增删改查(一)many to many

作者: 如雨随行2020 | 来源:发表于2022-01-06 08:40 被阅读0次

以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。

相关文章

网友评论

      本文标题:【JPA】联表的增删改查(一)many to many

      本文链接:https://www.haomeiwen.com/subject/lsyraltx.html