【问题标题】:Spring Data JPA method for deleting using a two fields in the embaddable key使用可嵌入键中的两个字段进行删除的 Spring Data JPA 方法
【发布时间】:2017-09-09 00:54:58
【问题描述】:

这是主实体类,有一个embeddedId

public class LabResHivMutation implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private LabResHivMutationPK id;

    private String comments;

    @Column(name="MUTATION_TYPE_ID")
    private BigDecimal mutationTypeId;

    @Column(name="VALUE")
    private String value;   

}

这是可嵌入密钥

@Embeddable
public class LabResHivMutationPK implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name="TO_INST")
    private Long toInst;

    @Column(name="REL_INVSTID")
    private long relInvstid;

    @Column(name="MUTATION_ID")
    private long mutationId;

}

spring data Jpa 中是否有任何删除方法可用于仅基于两个可嵌入键(toInst,relInvstid)进行删除。

我仍然可以编写一个 JPQL 查询来删除它。我的问题是有什么方法可以解决这个问题。

喜欢 deleteById 吗?

【问题讨论】:

    标签: spring-mvc jpa spring-data spring-data-jpa jpql


    【解决方案1】:

    是的,repo.deleteByIdToInstAndIdRelInvstid(toInst,relInnvstid) 如您所见,您必须指定 deleteByIdToInst ,这就是您引用嵌入 ID 的字段的方式,就像您引用外部关系的字段一样。这里Id 匹配你的字段命名

    @EmbeddedId
    private LabResHivMutationPK id;
    

    【讨论】:

    • org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: 已删除的对象将被级联重新保存(从关联中删除已删除的对象):[om.gov.moh.ais.lab. entity.LabResHivMutation#om.gov.moh.ais.lab.entity.LabResHivMutationPK@7dd46];嵌套异常是 java.lang.IllegalArgumentException:org.hibernate.ObjectDeletedException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[om.gov.moh.ais.lab.entity.LabResHivMutation#om.gov .moh.ais.lab.entity.LabResHivMutationPK@7dd46]
    • 如果没有要删除的记录会抛出异常。在查询的情况下,即使没有记录也不会抛出任何异常。
    • 删除Id不存在的实体时抛出异常是正常现象。这是一个意想不到的场景,因为您从查询结果中获得了该 ID,但现在它已经消失了。如果在删除时,您没有提供作为查询结果获得的 Id,而是您有另一种方式来输入这些 Id(用户输入、其他系统输入等),那么该字段可能不应该是其中的一部分主键,它应该是一个属性,如果是这种情况,您可以将其索引为唯一。至于上面的例外,我从来没有见过,所以我不能给你额外的帮助。干杯!
    【解决方案2】:

    有两种删除实体的方法:使用它自己的“JPA Repository 派生的删除方法long deleteByFirstIdAndSecondId(long firstId , secondId)
    在您的服务中,您可以简单地调用它:repository.deleteByFirstIdAndSecondId(long firstId , secondId)

    另一种方法是通过父实体排除子实体(或实体取决于关系类型)。

    【讨论】:

      【解决方案3】:

      当实体将有多个使用@Embedded 键的键时,用户下划线'_'。 示例:repository.deleteByid_toInst();

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2016-12-07
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多