jpa删除级联关系时(@OneToMany)只执行了查询语句而未删除

在使用jpa的时候,如果有@OneToMany(一对多)关系,想删除多的一方的数据会删除不了,也不会报错
解决方法:
在这里插入图片描述
大部分时候用到的是FetchType.EAGER,改成LAZY就行
这两个属性的区别是:

1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。

2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

3、比方User类有两个属性,name跟address,就像百度知道,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;
而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户
的所有资料都加载到对象中,于是有了这两种加载模式。

原因大概是因为有主外键,双向一对多关联,设置了立即加载的加载策略,导致产生了踢皮球的现象。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我能理解你的问题,您想知道如何在JPA 2.2.10 SQL查询中使用Dto @OneToMany。在JPA中,@OneToMany关系表示一个实体具有多个子实体。Dto(Data Transfer Object)用于在不同层之间传输数据。要在SQL查询中使用Dto @OneToMany,请遵循以下步骤: 1. 创建Dto类和其对应的子Dto类。 2. 在Dto类中使用@OneToMany注释来指定实体类和关联属性。 3. 在SQL查询中使用JOIN语句来连接Dto和相关的实体类。 4. 通过使用GROUP BY子句和构造函数表达式将结果转换为Dto对象。 下面是一个示例: ``` @Entity public class ParentEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) private List<ChildEntity> children; // getters and setters } @Entity public class ChildEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) private ParentEntity parent; // getters and setters } public class ParentDto { private Long id; private String name; private List<ChildDto> children; public ParentDto(Long id, String name, List<ChildDto> children) { this.id = id; this.name = name; this.children = children; } // getters and setters } public class ChildDto { private Long id; private String name; public ChildDto(Long id, String name) { this.id = id; this.name = name; } // getters and setters } String sql = "SELECT p.id, p.name, c.id, c.name FROM ParentEntity p JOIN p.children c"; List<Object[]> resultList = entityManager.createQuery(sql).getResultList(); Map<Long, ParentDto> parentMap = new HashMap<>(); for (Object[] result : resultList) { Long parentId = (Long) result[0]; String parentName = (String) result[1]; Long childId = (Long) result[2]; String childName = (String) result[3]; ParentDto parent = parentMap.get(parentId); if (parent == null) { parent = new ParentDto(parentId, parentName, new ArrayList<>()); parentMap.put(parentId, parent); } parent.getChildren().add(new ChildDto(childId, childName)); } List<ParentDto> parentDtos = new ArrayList<>(parentMap.values()); ``` 希望这能回答您的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值