package com.ankurm.hibernatedemo.datetime; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import java.time.Instant; import java.time.LocalDateTime; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * Backs ankurm.com post 4876, docs/13-date-and-time-mapping.md chapter "Second-precision / truncation". * Default (H2) profile here; see {@link NanosecondTruncationHsqldbTest} for the HSQLDB variant. */ @SpringBootTest class NanosecondTruncationTest { private static final Logger DEMO = LoggerFactory.getLogger("DEMO"); @Autowired private EntityManagerFactory emf; @Test void nanosecondsOnH2() { LocalDateTime withNanos = LocalDateTime.of(2026, 1, 1, 12, 0, 0, 123_456_789); Instant instantWithNanos = Instant.ofEpochSecond(1_800_000_000L, 123_456_789); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); NanoPrecisionEntity e = new NanoPrecisionEntity(); e.setPlainLocalDateTime(withNanos); e.setHighPrecisionLocalDateTime(withNanos); e.setPlainInstant(instantWithNanos); em.persist(e); em.getTransaction().commit(); Long id = e.getId(); em.close(); EntityManager em2 = emf.createEntityManager(); NanoPrecisionEntity loaded = em2.find(NanoPrecisionEntity.class, id); DEMO.info("H2 2.4.240: original LocalDateTime nanos = {}", withNanos.getNano()); DEMO.info("H2 2.4.240: plain column (precision default) nanos = {} (value={})", loaded.getPlainLocalDateTime().getNano(), loaded.getPlainLocalDateTime()); DEMO.info("H2 2.4.240: @Column(precision=9) column nanos = {} (value={})", loaded.getHighPrecisionLocalDateTime().getNano(), loaded.getHighPrecisionLocalDateTime()); DEMO.info("H2 2.4.240: original Instant nanos = {}", instantWithNanos.getNano()); DEMO.info("H2 2.4.240: plain Instant column nanos = {} (value={})", loaded.getPlainInstant().getNano(), loaded.getPlainInstant()); em2.close(); } }