我正在使用Spring Data,但对于自定义查询,我想开始使用EntityManager。 问题是除了使用EntityManager进行查询外,所有使用Spring Data的查询都正常工作。我一直有EntityManager查询的超时错误。
@Bean
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl(MessageFormat.format(Constants.DATABASE_CONNECTION_URL, host, port, schema));
ds.setUsername(username);
ds.setPassword(password);
ds.setTestWhileIdle(true);
ds.setValidationQuery(validationQuery);
ds.setTimeBetweenEvictionRunsMillis(validationTestInterval);
return ds;
}
@Bean
public EntityManager entityManager() {
return entityManagerFactory(dataSource()).createEntityManager();
}
@Bean
public EntityManagerFactory entityManagerFactory(BasicDataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(false);
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
vendorAdapter.setDatabase(Database.MYSQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan(
"com.xxx"
);
Properties properties = new Properties();
properties.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
properties.setProperty("hibernate.connection.url", MessageFormat.format(Constants.DATABASE_CONNECTION_URL, host, port, schema));
properties.setProperty("hibernate.connection.username", username);
properties.setProperty("hibernate.connection.password", password);
properties.setProperty("hibernate.c3p0.acquire_increment", "5");
properties.setProperty("hibernate.c3p0.idle_test_period", "300");
properties.setProperty("hibernate.c3p0.min_size", "5");
properties.setProperty("hibernate.c3p0.timeout", "1000");
factory.setJpaProperties(properties);
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
JpaDialect jpaDialect = new HibernateJpaDialect();
txManager.setEntityManagerFactory(entityManagerFactory);
txManager.setJpaDialect(jpaDialect);
txManager.setDefaultTimeout(60000);
txManager.setRollbackOnCommitFailure(true);
return txManager;
}
@Component
public class ReportGenerator {
@Autowired
private EntityManager entityManager;
private List<MyObject> doSomething() {
StringBuilder sql = new StringBuilder();
// build query
List<MyObject> list = entityManager.createNativeQuery(sql.toString(), MyObject.class).getResultList();
entityManager.clear();
return list;
}
有什么建议吗?
更新1:
validationQuery = SELECT 1;
validationTestInterval = 30000
答案 0 :(得分:0)
<强> @PersistenceContext 强>
@PersistenceContext
private EntityManager entityManager;
<强>更新强>
在我看来:这个简短的回答比没有更好,它可以节省我很多时间
没关系,但如何获得EnityManager? 这实际上可能是最酷的部分。基本上你只需要通过添加@PersistenceContext JPA注释来使用Spring就可以完全按照你的方式定义DAO。
- Вбинах,гденеобходимменеджерсущностейпометитьсоответствующееполеаннотацией@ PersistenceContext
醇>
@PersistenceContext注入容器管理的实例。