
com.xlrit.gears.engine.id.SequenceValueProducerImpl Maven / Gradle / Ivy
package com.xlrit.gears.engine.id;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.sequence.SequenceSupport;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.xlrit.gears.base.id.SequenceValueProducer;
@Component
public class SequenceValueProducerImpl implements SequenceValueProducer {
private static final Logger LOG = LoggerFactory.getLogger(SequenceValueProducerImpl.class);
private final EntityManager entityManager;
private final SequenceSupport sequenceSupport;
public SequenceValueProducerImpl(EntityManager entityManager) {
this.entityManager = entityManager;
Dialect dialect = entityManager.getEntityManagerFactory().unwrap(SessionFactoryImplementor.class).getJdbcServices().getDialect();
this.sequenceSupport = dialect.getSequenceSupport();
}
public long nextValue(String sequenceName) {
String sql = getSequenceNextValSql(sequenceName);
Query query = entityManager.createNativeQuery(sql);
Number nr = (Number) query.getSingleResult();
LOG.debug("nextValue({}): sql={}, nr={}, type={}", sequenceName, sql, nr, nr.getClass());
return nr.longValue();
}
// inspired by https://stackoverflow.com/a/23267212
private String getSequenceNextValSql(String sequenceName) {
return sequenceSupport.getSequenceNextValString(sequenceName);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy