1

我正在使用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

@PersistenceContext

@PersistenceContext 
private EntityManager entityManager; 

UPDATE:

在我看來:這個簡短的答案是比什麼都沒有,它更多更好可以爲我節省很多時間

link 1

這很好,但我如何得到一個EnityManager? 這實際上可能是最酷的部分。基本上你只需要定義一個DAO,就像你不使用Spring一樣,通過添加@PersistenceContext JPA註釋。

link 2 (rus)

  • Вбинах,гденеобходимменеджерсущностейпометитьсоответствующееполеаннотацией@PersistenceContext
  • link 3

    @PersistenceContext注入一個容器管理的實例。

    +1

    你能提供更多的細節嗎?這是如何回答這個問題的?這似乎不是很有用,因爲...... – Krease

    +0

    @Chris,不幸的是我現在沒有時間對這個問題進行深入調查,因爲衝刺結束等等,但我會盡量在以後做。這就是爲什麼這個答案的原因 - 在原始文章中使用entityManager使用的例子是@PersistenceContext註釋。所以最初的問題是我糟糕的複製粘貼。在任何更改@ Autowired - > @ PersistenceContext將解決該問題。查看我的更新以獲得答案,但對於@ Autowired情況下的行爲我仍然不知情。 – Alex