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

如何删除spring data jpa中位于多个侧面的项?

洪伟彦
2023-03-14

部门和员工之间存在双向的一对多关系。

@Setter
@Getter
@Entity
@Table(name = "t_department")
public class Department {
    @Id
    private String id;

    private String name;

    @OneToMany(mappedBy = "department",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private List<Employee> employees;
}


@Setter
@Getter
@Entity
@Table(name = "t_employee")
public class Employee {
    @Id
    private String id;

    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "dept_id")
    private Department department;
}

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, String> {

}

在数据库中,我有这些记录。

t_department:
+----+------------+
| id | name       |
+----+------------+
| 2  | accounting |
| 3  | logistics  |
+----+------------+

t_employee:
+----+------+---------+
| id | name | dept_id |
+----+------+---------+
| 3  | Tom  | 2       |
| 4  | Tina | 3       |
+----+------+---------+

当我试图删除员工(id=“3”)时,

    @Test
    @Transactional
    public void should_delete_employee_success_when_delete_employee_given_a_exist_employee_id_in_DB() {
        employeeRepository.delete("3");
    }

但在控制台中,它只打印了2条select语句,没有删除:

Hibernate: select employee0_.id as id1_2_0_, employee0_.dept_id as dept_id3_2_0_, employee0_.name as name2_2_0_, department1_.id as id1_1_1_, department1_.name as name2_1_1_ from t_employee employee0_ left outer join t_department department1_ on employee0_.dept_id=department1_.id where employee0_.id=?
Hibernate: select employees0_.dept_id as dept_id3_2_0_, employees0_.id as id1_2_0_, employees0_.id as id1_2_1_, employees0_.dept_id as dept_id3_2_1_, employees0_.name as name2_2_1_ from t_employee employees0_ where employees0_.dept_id=?

我去看了数据库,什么都没做。

spring data jpa是如何工作的?我困惑了好几天。

提前感谢您的回答。

共有3个答案

吴刚毅
2023-03-14

我发现,一旦部门知道谁与之相关,就不能删除与该部门相关的员工。我使用fetch=FetchType。双方都很急切,所以当我删除员工时,它将加载部门和该部门的员工。正确的做法是,您需要从部门的员工中删除该员工,然后将其删除。你可以试试这个:

    Optional<Employee> employeeOpt = employeeRepository.findById("3");
    if (employeeOpt.isPresent()) {
        Employee employee = employeeOpt.get();
        employee.getDepartment().getEmployees().removeIf(emp -> emp.getId().equals("3"));
        employeeRepository.deleteById("3");
    }
辛才俊
2023-03-14

因为默认情况下,Spring测试被标记为仅回滚,并且SQL更改通常仅在事务提交时刷新到数据库。

然后,您需要(1)手动刷新更改以强制数据库写入:

public class SomeTest{

    @PersistenceContext 
    private EntityManager em;

    @Test
    @Transactional
    public void should_delete_employee_success_when_delete_employee_given_a_exist_employee_id_in_DB() {
        employeeRepository.delete("3");
        em.flush(); //force db update however transaction will still be rolled back
    }

或(2)

将事务设置为不仅用于回滚,您可以通过各种方式进行回滚,包括使用“提交”和“回滚”注释:

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#integration-测试注释spring

阙辰龙
2023-03-14

CrudRepository有方法删除(

 类似资料:
  • 问题内容: 我试图一次从几个表中删除。我做了一些研究,并提出了 但是,我收到此错误 未捕获的Database_Exception [1064]:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’p,pa … 附近使用… 我以前从未做过跨表删除操作,所以我现在还没有经验,并且一直坚持下去! 我究竟做错了什么? 问题答案: 在语句中使用a 。 另外,您可以使用…

  • 我试图解决多边形与其他多边形比较的特殊情况。我有五个多边形分布如下图。面积最大的是黑色多边形。 可能还有其他类似的情况,主要规则是删除所有具有一个或多个公共边部分的多边形中最小的多边形。 此案例的数据位于GeoJson文件中,如下所示: 是否有只删除两个蓝色多边形(id 2和5)的解决方案?在python中。 通过将多边形转换为LineString,人们可以查看一个LineString是否是另一个

  • 问题内容: 我有一张游戏桌,描述如下: 但是每场比赛的表中都有一个重复的条目,因为每场比赛都在两支球队的赛程中。我是否可以使用一条sql语句根据相同的日期,时间,hometeam_id,awayteam_id,locationcity和locationstate字段浏览并删除所有重复项? 问题答案: 您应该能够执行相关的子查询来删除数据。查找所有重复的行,并删除除ID最小的行以外的所有行。对于MY

  • 下面的图表显示了一些值。 我想隐藏/删除右侧的值,因为左侧就足够了。 请参见下图: 代码如下: 我试图在Github上留档搜索: https://github.com/PhilJay/MPAndroidChart/wiki/The-Axis 但是没有运气。 我怎样才能从右侧删除值? 非常感谢您的建议。

  • 我正在创建一个脚本,用于将一个参数传入MySQL查询,然后执行该MySQL查询以从多个表中删除多条记录。 现在我遇到了一个问题,我需要为每个单独的表创建多个文件。是否有一种方法可以在一个文件中执行每个MySQL查询,而不是为每个查询创建多个文件? 以下是我创建的代码:

  • 问题内容: 我使用以下方式列出了重复项: 现在,如何删除除一条消息以外的所有消息(我正在尝试删除重复项,以便可以在上应用唯一索引)。 问题答案: 使用和分配行号,以便删除重复对中除一个以外的所有行。