创建了一个 Customer
实体和存储库:
public interface CustomerRepository extends CrudRepository<Customer, Long> {
}
和保存并选择实体的 bean:
@Component
public class BeanClass
{
@Autowired
CustomerRepository repository;
@Transactional
public void tran()
{
Customer entity = new Customer("Jack3", "Bauer");
Customer save1 = repository.save(entity);
Optional<Customer> byId = repository.findById(Long.valueOf(save1.getId()));
System.out.println("customer " + byId);
}
}
我在配置中指定了查询日志记录logging.level.org.hibernate.SQL=TRACE
:
spring.datasource.url=jdbc:mysql://localhost/demospring?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=*
spring.datasource.password=*
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
logging.level.org.hibernate.SQL=TRACE
log4j.logger.org.springframework.transaction=DEBUG
log4j.logger.org.springframework.orm.jpa=DEBUG
我在日志中没有看到 select
查询,只有被持久化的实体的日志记录:
2019-12-28 16:29:56.732 INFO 17623 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-12-28 16:29:57.331 INFO 17623 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 4.526 seconds (JVM running for 5.198)
2019-12-28 16:29:57.382 DEBUG 17623 --- [ main] org.hibernate.SQL : insert into customer (first_name, last_name) values (?, ?)
customer Optional[Customer[id=73, firstName='Jack3', lastName='Bauer']]
2019-12-28 16:30:03.455 INFO 17623 --- [ Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-12-28 16:30:03.457 INFO 17623 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2019-12-28 16:30:03.462 INFO 17623 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
这是主类:
@SpringBootApplication
public class DemoApplication
{
private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args)
{
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
BeanClass bc;
@Bean
public CommandLineRunner demo(CustomerRepository repository)
{
return (args) -> {
bc.tran();
};
}
}
能否记录findById
?
最佳答案
这是预期的:它不需要执行任何查询,因为您只是在同一个事务中持久化实体:它在一级缓存中。
顺便说一下,那时它甚至还没有被插入到数据库中。
如果您执行一个事务来保存实体,并执行另一个事务以通过 ID 查找它,那么您会看到正在执行的 SQL 查询。
关于java - Spring Data 不记录 findById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59511412/