【问题标题】:Jpa repository not deleting from dbJpa 存储库未从数据库中删除
【发布时间】:2019-05-18 17:18:52
【问题描述】:

所以,我有这个实体

@Entity
@Table(name = "VISITOR_IMAGE")
public class VisitorImage implements Serializable {

    @Id
    @Column(name = "VISITOR_ID")
    private Long visitorId;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @PrimaryKeyJoinColumn(name = "VISITOR_ID", referencedColumnName = "ID")
    private Visitor visitor;

    @Column(name = "NAME")
    private String name;

    @Column(name = "DATA")
    private byte[] data;

    @Column(name = "CONTENT_TYPE")
    private String contentType;

    @Column(name = "SIZE")
    private Long size;

    //getters and setters

}

这里我有 jpa 存储库:

@Repository
public interface VisitorImageRepository extends JpaRepository<VisitorImage, Long> {}

所以当我在服务中调用 delete 时,没有错误或任何东西,但它没有被删除

@Override
    public void deleteByVisitorId(Long visitorId) {
        visitorImageRepository.delete(visitorId);
}

我不知道为什么它没有被删除...表的主键是“VISITOR_ID”

我会补充一点,保存效果很好。

有什么帮助吗?

【问题讨论】:

  • 在 application.properties 中将日志设置为 logging.level.org.springframework.data.repository=DEBUG。它可能会在控制台中为您提供有关正在发生的事情的更多信息。

标签: java spring-boot jpa spring-data-jpa repository


【解决方案1】:

[已解决] 问题出在有

的访客实体上
@OneToOne(mappedBy = "visitor", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, orphanRemoval = true)
    private VisitorImage visitorImage;

我将 CascadeType 更改为仅 REMOVE,它现在可以工作了。

【讨论】:

    【解决方案2】:

    你可以试试下面的替代方法deleteById

    public void deleteUserById(long id) {
            visitorRepository.deleteById(id);
    }
    

    【讨论】:

    • 我已经尝试过了,deleteByVisitorId(Long visitorId),但同样的事情
    • 那么依赖可能有问题,你试过 CrudRepository
    【解决方案3】:

    您已将访问者映射为一对一并将级联选项映射为持久,即“cascade=CascadeType.PERSIST” 它阻止您删除。 要删除,您需要将级联选项设置为 Cascade.All 或 Cascade.Remove

    【讨论】:

    • 我都试过了,我都得到了这个异常:org.postgresql.util.PSQLException:错误:更新或删除表“visitor”违反了表“visitor_image”上的外键约束“profile_image_visitor_fk”详细信息:键 (id)=(46) 仍然从表“visitor_image”中引用。但我不想从visitor表中删除visitor,只是visitor_image表中的行
    【解决方案4】:

    将您的存储库自动连接到您编写此删除方法的类。 喜欢

    @Autowired 
    private VisitorImageRepository visitorRepository;
    

    然后调用delete方法。

    visitorRepository.delete(visitorId);
    

    关注级联类型。由于级联,它无法删除其父表条目,直到子表未被删除。

    所以尝试评论级联类型。

    【讨论】:

    • 我做到了,只是没有在这里复制..所以这不是问题
    • 您的联系人实体有一个 @OneToOne,在某些属性上带有 Cascade。尝试评论级联类型...因为级联使条目依赖于其他条目。它现在允许您在删除其子条目之前删除其父表条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多