Hi all i have defined two Entities : the first

import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Parameter; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.NaturalId;

import java.io.Serializable; import java.util.Objects;

/* * * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email giuseppe.lascaleia@geosdi.org / @Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "carCacheRegion") @Getter @Setter @ToString public class Car implements Serializable {

private static final long serialVersionUID = 7556465403027719413L;
//
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "car_generator")
@GenericGenerator(name = "car_generator",
        strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
                @Parameter(name = "sequence_name", value = "CAR_SEQ"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "3"),
                @Parameter(name = "optimizer", value = "pooled-lo")
        }
)
private Long id;
//
@NaturalId
private String plate;
//
@Column(name = "model")
private String model;

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    Car car = (Car) o;
    return id.equals(car.id) && plate.equals(car.plate);
}

@Override
public int hashCode() {
    return Objects.hash(id, plate);
}

}

the second :

import jakarta.persistence.Index; import jakarta.persistence.Table; import jakarta.persistence.; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.Cache; import org.hibernate.annotations.; import org.hibernate.annotations.Parameter;

import java.io.Serializable; import java.util.Objects;

/* * @author Nazzareno Sileno - CNR IMAA geoSDI Group * @email nazzareno.sileno@geosdi.org / @Entity @Table(indexes = { @Index(name = "ROLEPROPS_PROPVALUE_INDEX", columnList = "partName")}, name = "CAR_PARTS", uniqueConstraints = { @UniqueConstraint(columnNames = {"partname", "carplate"})}) @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "carPartCacheRegion") @Getter @Setter @ToString public class CarPart implements Serializable {

private static final long serialVersionUID = 2061845368648914687L;
//
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "car_part_generator")
@GenericGenerator(name = "car_part_generator",
        strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
                @Parameter(name = "sequence_name", value = "CAR_PART_SEQ"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "3"),
                @Parameter(name = "optimizer", value = "pooled-lo")
        }
)
private Long id;
//
@ManyToOne(optional = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "carplate", referencedColumnName = "plate", nullable = false)
private Car car;
//
@NaturalId
@Column(name = "partname", columnDefinition = "VARCHAR(2048)")
private String partName;

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    CarPart carPart = (CarPart) o;
    return id.equals(carPart.id) && partName.equals(carPart.partName);
}

@Override
public int hashCode() {
    return Objects.hash(id, partName);
}

}

I defined a test :

import org.geosdi.geoplatform.persistence.demo.dao.ICarDAO; import org.geosdi.geoplatform.persistence.demo.dao.ICarPartDAO; import org.geosdi.geoplatform.persistence.demo.model.Car; import org.geosdi.geoplatform.persistence.demo.model.CarPart; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader;

import static org.junit.Assert.*;

/* * * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email giuseppe.lascaleia@geosdi.org / @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {GPPersistenceLoaderDemoConfig.class}, loader = AnnotationConfigContextLoader.class) @ActiveProfiles(value = {"jpa"}) public class PersistenceJpaTest {

private final static String PART_NAME = "Gearbox";
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//
@Autowired
private ICarDAO jpaCarDAO;
//
@Autowired
private ICarPartDAO jpaCarPartDAO;

@After
public void tearDown() throws Exception {
    removeAll();
}

@Before
public void setUp() {
    insert();
}

@Test
public void testJpaProfile() throws Exception {
    assertEquals(100, this.jpaCarDAO.count().intValue());
    logger.info("FOUND PART @@@@@@@@@@@@@@@@@@@@@@@@@@: {}", this.jpaCarPartDAO.findByPartName(PART_NAME + 0).getPartName());
    CarPart test = this.jpaCarPartDAO.findByPartName(PART_NAME + 0);
    assertNotNull("The car part is not null", test);
    assertEquals(100, this.jpaCarDAO.findAll().size());
    Car car = this.jpaCarDAO.findByPlate("AR7930");
    assertNotNull(car);
    car.setModel("MODEL_TEST");
    this.jpaCarDAO.update(car);
    logger.info("##################################UPDATE_CAR : {}\n", car.getModel());
    CarPart carPart = this.jpaCarPartDAO.findByPartName(PART_NAME + 20);
    assertNotNull(carPart);
    carPart.setCar(car);
    this.jpaCarPartDAO.update(carPart);
    assertTrue(carPart.getCar().getId().equals(car.getId()));
    logger.info("########################################FIND_CAR_BY_ID : {}\n", this.jpaCarDAO.find(car.getId()));
}

private void insert() {
    for (int i = 0; i < 100; i++) {
        Car car = new Car();
        car.setPlate("AR793" + i);
        car.setModel("Fiat Model " + i);
        CarPart carPart = new CarPart();
        carPart.setPartName(PART_NAME + i);
        carPart.setCar(car);
        jpaCarDAO.persist(car);
        jpaCarPartDAO.persist(carPart);
    }
}

private void removeAll() throws Exception {
    jpaCarDAO.removeAll();
    logger.info("REMOVED ALL CARS ##################################");
}

}

If i tun the test with h2 driver i have this error : 08:42:15.228 [main] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 42122, SQLState: 42S22 08:42:15.228 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Column "PUBLIC.CAR_SEQ.NEXTVAL" not found; SQL statement: select public.CAR_SEQ.nextval [42122-214] jakarta.persistence.PersistenceException: Converting org.hibernate.exception.SQLGrammarException to JPA PersistenceException : could not prepare statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:165) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:175) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:743) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:721) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:307) at jdk.proxy2/jdk.proxy2.$Proxy116.persist(Unknown Source) at org.geosdi.geoplatform.persistence.dao.jpa.GPAbstractJpaDAO.persist(GPAbstractJpaDAO.java:82) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:218) at jdk.proxy2/jdk.proxy2.$Proxy119.persist(Unknown Source) at org.geosdi.geoplatform.persistence.demo.PersistenceJpaTest.insert(PersistenceJpaTest.java:113) at org.geosdi.geoplatform.persistence.demo.PersistenceJpaTest.setUp(PersistenceJpaTest.java:82) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283) at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:75) at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:100) at org.hibernate.id.enhanced.PooledLoOptimizer.generate(PooledLoOptimizer.java:61) at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:536) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:114) at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:184) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:129) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:53) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:737) ... 52 more Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "PUBLIC.CAR_SEQ.NEXTVAL" not found; SQL statement: select public.CAR_SEQ.nextval [42122-214]

I writed a test with Hibernate without Spring and all rocks . here my test with Hibernate .

Here my hibernate.cfg.xml file

org.h2.Driver jdbc:h2:mem:persistence;DB_CLOSE_DELAY=-1 sa 1 org.hibernate.dialect.H2Dialect true thread create-drop

and here my simple test :

import org.geosdi.geoplatform.persistence.demo.model.Car; import org.geosdi.geoplatform.persistence.demo.model.CarPart; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

/* * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email giuseppe.lascaleia@geosdi.org / public class HibernateNativeTest {

private static final Logger logger = LoggerFactory.getLogger(HibernateNativeTest.class);
//
private static SessionFactory sessionFactory;
private final static String PART_NAME = "Gearbox";

@Before
public void setUp() throws Exception {
    StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    MetadataSources sources = new MetadataSources(registry);
    // Create Metadata
    Metadata metadata = sources.getMetadataBuilder().build();
    // Create SessionFactory
    sessionFactory = metadata.getSessionFactoryBuilder().build();
}

@Test
public void simpleTest() throws Exception {
    Transaction transaction = null;
    try (Session session = sessionFactory.openSession()) {
        // start a transaction
        transaction = session.beginTransaction();
        for (int i = 0; i < 100; i++) {
            Car car = new Car();
            car.setPlate("AR793" + i);
            car.setModel("Fiat Model " + i);
            CarPart carPart = new CarPart();
            carPart.setPartName(PART_NAME + i);
            carPart.setCar(car);
            session.save(car);
            session.save(carPart);
        }
        // commit transaction
        transaction.commit();
    } catch (Exception e) {
        if (transaction != null) {
            transaction.rollback();
        }
        e.printStackTrace();
    }
}

} Regards Giuseppe

Comment From: glascaleia

The Problem is related to the property : hibernate.temp.use_jdbc_metadata_defaults. I setted to FALSE , with the Hibernate 5.x it doesn't cause error. Setting to TRUE there is no error.