当前位置: 首页 > 知识库问答 >
问题:

清除与JPA/JPQL的多人关系

步博厚
2023-03-14

我有用户和角色。每个用户可以有许多角色。

我希望有一个批量操作,如删除所有用户角色,但保留用户和角色。那么,如何只截断manytomy表呢?

还有很长的路要走-

@Entity
@Table
public class Role {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @ManyToMany(mappedBy = "roles")
    private Set<User> users = new HashSet<>();
}
@Entity
@Table
public class User {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @ManyToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST})
    @JoinTable(
            name = "UserRole",
            joinColumns = {@JoinColumn(name = "id")},
            inverseJoinColumns = {@JoinColumn(name = "id")})
    private Set<Role> roles = new HashSet<>();
}
@Repository
public interface UsersRepository extends JpaRepository<User, Long> {

    @Modifying
    @Query("UPDATE User u SET u.roles = null")
    void clearAllRoleRelations();
}

我尝试了此操作,但得到了DML操作不支持的异常[更新users.entity.User u SET u.roles=null]

共有2个答案

哈扬
2023-03-14

我让它工作了,但使用了一个本机查询,然后需要entityManager。如果要在同一事务中使用此选项,请清除。

    @Modifying
    @Query(nativeQuery = true, value = "DELETE FROM user_role")
    void clearAllRoleRelations();

  @Autowired
  private EntityManager entityManager;
    

  @Test
    public void clearAllRoleRelations() {

        //given
        Role roleIn = new Role();
        roleIn.setId(27L);

        User userIn = new User();
        userIn.Id(12L);

        //do
        roleIn = rolesRepository.save(roleIn);
        userIn = usersRepository.save(userIn);
        userIn.getRoles().add(roleIn);
        usersRepository.save(userIn);

        //verify
        usersRepository.clearAllRoleRelations();

        //important within the same transaction (native query)
        entityManager.clear();

        Optional<User> userOut = usersRepository.findById(userIn.getId());
        assertThat(userOut.isPresent()).isTrue();
        assertThat(userOut.get()).isEqualTo(userIn);
        assertThat(userOut.get().getRoles()).isEmpty();
    }
邹举
2023-03-14

丢弃多个,并为联接表创建一个enity。这样,您就可以完全控制删除。

 类似资料:
  • 在一个理论实体中,我有这样的配置: 当我删除实体时,它会尝试首先删除表,而不是连接的表,因此我会得到以下错误:

  • 我用复合键定义了两个实体之间的多对多关系。问题是,当我获得join对象时,它只被过滤了关系的一侧,而不是两边。 图片使问题更加清晰。这里,我要查找的是dtid=185和prid=352,但我从多对多关系中得到的是两个突出显示的行。 天丁:

  • 问题内容: 使用Criteria或HQL有什么利弊?Criteria API是在Hibernate中表达查询的一种很好的面向对象的方式,但是有时候Criteria Queries比HQL更难以理解/构建。 您何时使用标准以及何时使用HQL?在哪种用例中,您更喜欢什么?还是只是口味问题? 问题答案: 我最喜欢动态查询的条件查询。例如,动态添加一些订购或根据某些参数省去某些零件(例如限制)要容易得多。

  • 问题内容: 我以为我知道该如何使用,但显然不知道如何使用。谁能帮我? 这给我例外 与拥有OneToMany关系。 我的第二个问题是,说此查询返回唯一的结果,那么如果我这样做 代表上面的查询名称。那么,将其串联在一起还是会得到回报? 问题答案: JPQL中的一对多关系如下所示: 在子句中指定多个属性时,结果返回为: 顺便说一下,为什么您的实体以复数形式命名,这令人困惑。如果要使用复数形式的表名,则可

  • 主要内容:JPQL功能特性,在JPQL中创建查询JPQL(Java持久性查询语言)是一种面向对象的查询语言,用于对持久实体执行数据库操作。 JPQL不使用数据库表,而是使用实体对象模型来操作SQL查询。 这里,JPA的作用是将JPQL转换为SQL。因此,它为开发人员提供了一个处理SQL任务的简单方式。 JPQL是实体JavaBeans查询语言(EJBQL)的扩展,向其添加了以下重要功能 - 它可以执行连接操作。 它可以批量更新和删除数据。 它可

  • 对于我的任务,我需要使用JPA创建多对多的关系,但是连接表是手动指定的,并带有额外的列。数据结构如下所示: 图书(id、名称、已出版、流派、评级) 作者(身份证、姓名、性别、出生) 图书-作者(id,book-id,author-id) 我创建了这样的实体: 作者: 书: AuthorBook表: 例如,当我删除ID=2的book,它将删除ID=1的author。有没有什么方法可以在不删除已绑定作