~~保存~~ 是什么意思 ~~(S实体); 在Spring Repository中?~~
问题内容:
~~~~
在Spring Data项目中,CrudRepository为正在管理的实体类提供复杂的CRUD功能。
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
// … more functionality omitted.
}
通常,我知道“ S扩展T”的含义,即保存操作的返回类型S必须是T的子类型。为什么必须添加诸如约束?我认为这样做是可以的:
T save (T entity);
如
void delete(T entity);
谢谢。
问题答案:
~~~~
如果你要拥有它
T save (T entity);
然后,您可以将结果分配给的唯一变量必须是type T
。
因此,如果您有一个CrudRepository<Animal,AnimalID> repository
,并且您有
Dog dog = getDog();
Dog savedDog = repository.save(dog);
您会遇到编译错误-您无法将结果分配给Dog
,因为它必须是类型T
,在这种情况下为Animal
。
您需要检查返回的值是否确实是类型Dog
,如果是,则将其强制转换Dog
为savedDog
。
声明保持原样,这意味着您可以将其分配给与原始参数相同类型的变量,因为类型解析允许这样做。
声明本身并没有指定如何保存狗的非动物部分。它所做的就是允许将结果Dog
原本分配给a Dog
。