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;
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With