我试图删除主键 = 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/