Я пробую сочетание 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