3

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;

1 Answer 1

3

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.