Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot delete a database entry with a primary key of 0 using JPA (MySQL)

I am trying to delete an element with primary key = 0 but nothing is happening. I have a set of test data that I uploaded in a data.sql file. I thought maybe there might some reference to this entry in another table that I overlooked, so I just dropped all other tables except element and it is still not deleting. I have successfully deleted all other rows, but zero just won't go.

To confirm this, I went into Sqlectron (sql client) and tried to run the statement there, and it works. It just doesn't work using JPA. What's going on here?

@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;
like image 480
Joe Avatar asked Nov 28 '25 12:11

Joe


1 Answers

0 has the special meaning of unassigned identifier when the id type is a primitive. That's because is not possible to use null with primitive types.

Before deleting the entity, Spring checks if the id of the entity is assigned and - because your entity has id 0 - decides that it's not, it's a new entity and there's nothing to delete.

My suggestion is to avoid using primitive types as id, or make sure that an id is always bigger than 0.

like image 91
Davide D'Alto Avatar answered Nov 30 '25 04:11

Davide D'Alto



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!