mysql - 无法使用 JPA (MySQL) 删除主键为 0 的数据库条目

标签 mysql spring-boot spring-data-jpa

我试图删除主键 = 0 的元素,但没有任何反应。我有一组测试数据,已上传到 data.sql 文件中。我想也许在我忽略的另一个表中可能有一些对这个条目的引用,所以我只是删除了除 element 之外的所有其他表,但它仍然没有删除。我已成功删除所有其他行,但零行不会消失。

为了确认这一点,我进入 Sqlectron(sql 客户端)并尝试在那里运行该语句,并且它有效。使用 JPA 是行不通的。这是怎么回事?

@Entity
@Table(name = "element")
@NamedEntityGraph(name = graph.element.accounts, attributeNodes = @NamedAttributeNode("accounts"))
public class Element extends Entry {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "name", nullable = false, unique = true)
    @NotBlank
    private String name;

    @OneToMany(mappedBy = "element", cascade = CascadeType.PERSIST)
    private List<Account> accounts;

    // constructor, getters, setters, equals, hashcode
}
@Service
public class ElementService {

    private final ElementDAO DAO;

    @Autowired
    public ElementService(ElementDAO DAO) {
        this.DAO = DAO;
    }

    public Element find(int id) {
        return DAO.findById(id).orElse(null);
    }

    public void delete(Element element) {
        DAO.delete(element);
    }
}
@Repository
public interface ElementDAO extends PagingAndSortingRepository<Element,Integer> {
}
@SpringBootTest
@ActiveProfiles("test")
class ElementServiceTests {

    @Autowired
    private ElementService svc;

    @Test
    public void test() {
        svc.delete(new Element(0, "Other"));
        assertNull(svc.find(0));
    }
}
org.opentest4j.AssertionFailedError: 
Expected :null
Actual   :Element{id=0, name='Other'}
INSERT INTO element
(id, name, created_at, created_by)
VALUES
(1, 'Asset', CURRENT_DATE, 'DBA'),
(2, 'Liability', CURRENT_DATE, 'DBA'),
(3, 'Equity', CURRENT_DATE, 'DBA'),
(4, 'Income', CURRENT_DATE, 'DBA'),
(5, 'Expense', CURRENT_DATE, 'DBA'),
(0, 'Other', CURRENT_DATE, 'DBA');
-- works in sqlectron
delete from element where id = 0;

最佳答案

当 id 类型为基元时,

0 具有未分配标识符的特殊含义。这是因为不可能将 null 与原始类型一起使用。

Before deleting the entity, Spring检查id是否the entity is assigned并且 - 因为您的实体具有 id 0 - 决定它不是,它是一个新实体,并且没有任何可删除的内容。

我的建议是避免使用原始类型作为 id,或者确保 id 始终大于 0。

关于mysql - 无法使用 JPA (MySQL) 删除主键为 0 的数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73174679/

相关文章:

php - 使用 AJAX、MySQL 和 PHP 添加、删除、更新

spring-boot - TestRestTemplate 与 WebTestClient 与 RestAssured : What is the best approach for integration testing of Spring Boot Rest API

java - Spring 错误: No property prod found for type Product

java - 如何将对象从注册表传输到 Controller 以写入数据库并分配角色?

java - 从端点调用时,Spring Boot 获取 UTC+1 而不是 GMT

java - Spring Data JPA - 使用标志列的存储库 findAll 方法

java - Spring MVC 和 Spring Data Repository 不起作用

PHP : could not find driver (PDO, MySql)

php - 将arduino sketch中的另一个数据列添加到mysql数据库中

php - 构建协作工具 - 检查用户当前是否正在编辑/拖动元素并显示对话框