Hibernate, выполняющий разные запросы в одной и той же транзакции, приводит к тому же выполненному запросу - PullRequest
0 голосов
/ 16 марта 2020

Я пробую сочетание Spring с Hibernate, но я не могу выполнить 2 запроса в одной транзакции:

@Autowired
private SessionFactory sessionFactory;

@Transactional
public void registerUser(String username, String email, String password) {
    System.out.println("Query 1:");
    CriteriaBuilder criteriaBuilder1 = sessionFactory.getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<UserRecord> query1 = criteriaBuilder1.createQuery(UserRecord.class);
    Root<UserRecord> root1 = query1.from(UserRecord.class);
    query1 = query1.select(root1).where(criteriaBuilder1.and(
            criteriaBuilder1.equal(root1.get("users_name"), "name"),
            criteriaBuilder1.equal(root1.get("users_email"), "email@test.com")));
    sessionFactory.getCurrentSession().createQuery(query1).uniqueResultOptional();

    System.out.println("Query 2:");
    CriteriaBuilder criteriaBuilder2 = sessionFactory.getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<UserRecord> query2 = criteriaBuilder2.createQuery(UserRecord.class);
    Root<UserRecord> root2 = query2.from(UserRecord.class);
    query2 = query2.select(root2).where(criteriaBuilder2.equal(root2.get("users_email"), "email@test.com"));
    sessionFactory.getCurrentSession().createQuery(query2).uniqueResultOptional();
}

В результате, когда я вызываю этот код, (он вызывается в компоненте на данный момент):

Query 1:
Hibernate: select u1_0.users_pk, u1_0.users_email, u1_0.users_name from users as u1_0 where u1_0.users_name = ? and u1_0.users_email = ?
Query 2:
Hibernate: select u1_0.users_pk, u1_0.users_email, u1_0.users_name from users as u1_0 where u1_0.users_name = ? and u1_0.users_email = ?

Но я ожидаю, что запрос 2 будет:

select u1_0.users_pk, u1_0.users_email, u1_0.users_name from users as u1_0 where u1_0.users_email = ?

Если я переключу запрос 1 и запрос 2, результат будет :

Query 1:
Hibernate: select u1_0.users_pk, u1_0.users_email, u1_0.users_name from users as u1_0 where u1_0.users_email = ?
Query 2:
Hibernate: select u1_0.users_pk, u1_0.users_email, u1_0.users_name from users as u1_0 where u1_0.users_email = ?

Вот фрагмент из моей конфигурации hibernate:

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(DAO_PACKAGE);
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}

private Properties hibernateProperties() {
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.show_sql", "true");
    hibernateProperties.setProperty("hibernate.dialect", databaseProperties.getDatabaseType().getDialect());
    return hibernateProperties;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager() {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

Является ли способ, которым я настроил Spring с Hibernate, не правильным способом (или мое использование API-интерфейса запроса неверно )?

Информация, мои зависимости:

  • org.springframework.spring-orm : 5.2.4.RELEASE
  • org.hibernate.orm.hibernate-core : 6.0.0.Alpha4
  • org. apache .tomcat.tomcat-dbcp : 10.0.0-M1
  • орг. postgresql. postgresql: 42.2.10
...