在org.springframework.data.repository,CrudRepository
接口的delete
方法的描述中,只写它删除给定的实体并接受实体对象本身。
它没有指定实体的id必须是唯一的
但是,此方法仅在实体具有唯一id时有效。如果表中可能有多个具有相同id的行,则当试图删除id不是唯一的实体时(至少在我的情况下),此方法会失败。
现在我明白了,id在表中不是唯一的,这是一件非常糟糕的事情,但是,理论上,它应该工作,因为这个方法接受整个实体作为参数,并且我的表中的每个实体(当它的所有列合并时)都是唯一的。表中不存在完全相同的两行,因为表对其所有列的组合有唯一的约束。
当然,还有其他方法,如deleteById
,这将失败,因为他们只接受id作为一个参数,而不是整个实体,因为id不是唯一的,Spring不知道要删除哪个实体。当然。
但是为什么delete
方法失败,当它应该能够区分具有相同id的实体,因为它接受整个实体作为参数(从而使其访问实体的所有其他列,而不仅仅是id列)?
JPA id的要求是它是一个主键,即唯一地标识行。如果你不这样做,不好的事情就会发生。但是,您可以使用复合主键,因为您的行似乎由多个列标识。查看@Embeddable
/@EmbeddedId
的映射。