All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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