java - Spring Boot 中的 CrudRespository 方法在哪里实现?
问题描述
我是 Spring Boot 的新手,我看到应用程序类使用了 CrudRepository 接口。我看到调用了 CrudRepository 接口的 .save() 方法,但我不明白该方法在哪里实现。这是否发生在 Spring 后端的某个地方?
这是应用程序类:
@SpringBootApplication
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a couple of customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// fetch an individual customer by ID
repository.findById(1L)
.ifPresent(customer -> {
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
});
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}
}
CustomerRepository 扩展 CrudRepository:
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}
解决方案
可以在SimpleJpaRepository
类中找到以下代码:
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
我确信根据您拥有的数据库/持久性提供程序的类型,还有更多可用的实现,但正如您所看到的,它是标准 JPA 实现的简单包装器。
推荐阅读
- c# - 如何修复无法转换类型错误?
- python - 如何在 python 文件中使用密码?
- javascript - Rails 5:具有设计和 html5 地理定位问题的 Omniauth
- cordova - Cordova InAppBrowser 页脚未在 android 中显示
- vue.js - 用于 Vuetify 的多线卡轮播卡
- java - 在后台构建 MongoDB 索引作为所有连接的默认行为
- javascript - 仅当 3 个输入都没有焦点时运行函数 onblur
- javascript - 如何将菜单内的项目从跨度更改为自定义 div?
- .net - 类型 [CONTROL] 未定义
- c++ - 如何使用 unique_ptr 作为值迭代映射字符串键?