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
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.