Since Hibernate 6.4.0 (including 6.4.1) exception is thrown on code that was working well with 6.3.2.
Couldn’t find anything about it in migration guide.
[ERROR] (AfterApplicationReadyServiceImpl.java:107)
Exception while trying to fetch currency rates:
Could not convert ‘java.util.Currency’ to ‘java.util.Currency’
using ‘org.hibernate.type.descriptor.java.CurrencyJavaType’ to wrap
// code snippet from `updateCurrencyRates()
// called from `AfterApplicationReadyServiceImpl`
final CustomCurrency currency = this.currencyRepository.getByIso4217( "CHF" );
The question: Is there anything I should change / update?
Previously I’ve been using QueryDSL but the project is dead and that’s why I switched to Criteria API which is less readable and uses large amounts of bloating code.
CustomCurrency.java
@Entity
public class CustomCurrency implements Serializable {
private static final long serialVersionUID = 3059291965021465724L;
@Id private Integer id;
private java.util.Currency javaCurrency;
private Boolean isReference = Boolean.FALSE;
private Boolean isDefault = Boolean.FALSE;
}
CurrencyRepositoryImpl.java
public class CurrencyRepositoryImpl {
public CustomCurrency findByIso4217(final String iso4217code) {
final CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
final CriteriaQuery<CustomCurrency> criteriaQuery = criteriaBuilder.createQuery(CustomCurrency.class);
final Root<CustomCurrency> root = criteriaQuery.from(CustomCurrency.class);
final Path<CustomCurrency> path = root.get("javaCurrency");
final java.util.Currency javaCurrency = java.util.Currency.getInstance(iso4217code);
final Predicate predicate = criteriaBuilder.equal(path, javaCurrency);
criteriaQuery.where(predicate);
final TypedQuery<CustomCurrency> typedQuery = this.entityManager.createQuery(criteriaQuery);
// exception is thrown while executing `getResultList()`
final List<CustomCurrency> results = typedQuery.getResultList();
if (results.isEmpty()) {
return null;
}
if (results.size() > 1) {
Log.error("Too many results ({})", Integer.valueOf(results.size()));
return null;
}
return results.get(0);
}
}
AfterApplicationReadyServiceImpl.java
@Service
public class AfterApplicationReadyServiceImpl
implements AfterApplicationReadyService
{
@Transactional(readOnly = false)
@Override
public void afterStartup() throws InterruptedException {
this.currencyUpdaterService.updateCurrencyRates();
}
}