I have a strange behavior with some of my entities after migration from Hibernate 3 to Hibernate 5.2.17.Final and Spring from 3 to 5.0.5.RELEASE version
When I try to save an entity *Organisation*, I receive an error ` * SqlExceptionHelper - Invalid column name 'contactInformation_id'. ` * Here is the *Organisation* class:
{code:java} @Entity(name = "Organisation") @Table(name = "organisation", uniqueConstraints = {@UniqueConstraint(name = "organisation_name_udx", columnNames = {"name"})}) @NoArgsConstructor @EntityListeners(EntityCreateListener.class) public class Organisation implements Serializable, PatientListEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Getter @Setter private Long id;
@Length(max = MAX_NAME_LENGTH) @NotEmpty @Getter @Setter private String name;
// Some other filds
@Embedded @Valid private PrimaryContact primaryContact;
@Getter @OneToMany(mappedBy = "organisation", orphanRemoval = true, cascade = CascadeType.ALL) @MapKeyColumn(name = "application_code") @JsonManagedReference private Map<ApplicationEnum, ApplicationDmeProvider> applicationDmeProviderMap = new HashMap<>();
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Fetch(FetchMode.SELECT) @JoinColumn(name = "image_id", nullable = true) @Getter @Setter private Image logo;
@ManyToMany @Fetch(FetchMode.SELECT) @JoinTable( name = "billing_plan_organisation", joinColumns = {@JoinColumn(name = "organisation_id")}, inverseJoinColumns = {@JoinColumn(name = "billing_plan_id")}) @Getter private Set<BillingPlan> billingPlans = new HashSet<>();
// Some other filds } {code}
Here is the PrimaryContact class:
{code:java} @Embeddable public class PrimaryContact extends Person implements Serializable {
@Valid @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "primary_contact_information_id") private ContactInformation contactInformation; } {code}
Here is the ContactInformation class:
{code:java} 0
I have a strange behavior with some of my entities after migration from Hibernate 3 to Hibernate 5.2.17.Final and Spring from 3 to 5.0.5.RELEASE version
When I try to save an entity Organisation, I receive an error SqlExceptionHelper - Invalid column name 'contactInformation_id'.
Here is the Organisation class:
@Entity(name = "Organisation") @Table(name = "organisation", uniqueConstraints = {@UniqueConstraint(name = "organisation_name_udx", columnNames = {"name"})}) @NoArgsConstructor @EntityListeners(EntityCreateListener.class) public class Organisation implements Serializable, PatientListEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Getter @Setter private Long id;
@Length(max = MAX_NAME_LENGTH) @NotEmpty @Getter @Setter private String name;
// Some other filds
@Embedded @Valid private PrimaryContact primaryContact;
@Getter @OneToMany(mappedBy = "organisation", orphanRemoval = true, cascade = CascadeType.ALL) @MapKeyColumn(name = "application_code") @JsonManagedReference private Map<ApplicationEnum, ApplicationDmeProvider> applicationDmeProviderMap = new HashMap<>();
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @Fetch(FetchMode.SELECT) @JoinColumn(name = "image_id", nullable = true) @Getter @Setter private Image logo;
@ManyToMany @Fetch(FetchMode.SELECT) @JoinTable( name = "billing_plan_organisation", joinColumns = {@JoinColumn(name = "organisation_id")}, inverseJoinColumns = {@JoinColumn(name = "billing_plan_id")}) @Getter private Set<BillingPlan> billingPlans = new HashSet<>();
// Some other filds }
Here is the *PrimaryContact* class:
@Embeddable public class PrimaryContact extends Person implements Serializable {
@Valid @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "primary_contact_information_id") private ContactInformation contactInformation; }
Here is the *ContactInformation* class:
@Entity(name = "ContactInformation") @Table(name = "contact_information") @Data @NoArgsConstructor public class ContactInformation implements Serializable { public static final int MAX_PHONENUMBERS = 5;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Valid @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "address_id") private Address address = new Address();
@RFCEmail @Size(max = RFCEmailValidator.EMAIL_TOTAL_MAX_LENGTH) private String email = "";
@Valid @Embedded @AttributeOverrides({@AttributeOverride(name = "number", column = @Column(name = "phone_number_0")), @AttributeOverride(name = "type", column = @Column(name = "phone_type_0"))}) private PhoneNumber phoneNumber0;
@Valid @Embedded @AttributeOverrides({@AttributeOverride(name = "number", column = @Column(name = "phone_number_1")), @AttributeOverride(name = "type", column = @Column(name = "phone_type_1"))}) private PhoneNumber phoneNumber1;
@Valid @Embedded @AttributeOverrides({@AttributeOverride(name = "number", column = @Column(name = "phone_number_2")), @AttributeOverride(name = "type", column = @Column(name = "phone_type_2"))}) private PhoneNumber phoneNumber2;
@Valid @Embedded @AttributeOverrides({@AttributeOverride(name = "number", column = @Column(name = "phone_number_3")), @AttributeOverride(name = "type", column = @Column(name = "phone_type_3"))}) private PhoneNumber phoneNumber3;
@Valid @Embedded @AttributeOverrides({@AttributeOverride(name = "number", column = @Column(name = "phone_number_4")), @AttributeOverride(name = "type", column = @Column(name = "phone_type_4"))}) private PhoneNumber phoneNumber4;
@OneToOne @JoinColumn(name = "time_zone_code") private TimeZone timeZone; } {code}
It looks like the @JoinColumn annotation doesn't work with @Embeddable and @OneToOne somehow...
The full stack trace is here:
{code:java} javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:917) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:876) at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261) at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:467) at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:392) at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:193) at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:500) at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:432) at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:395) at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:193) at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:126) at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:445) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:239) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:173) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:884) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:870) at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:304) at com.sun.proxy.$Proxy139.merge(Unknown Source) at easycare.dao.AbstractRepository.save(AbstractRepository.java:50) at easycare.dao.AbstractRepository$$FastClassBySpringCGLIB$$3c84e743.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) at easycare.dao.OrganisationRepository$$EnhancerBySpringCGLIB$$e8684dc6.save(<generated>) at easycare.dao.NonTransactionalRepositoryTest.createAndSaveSleepLab(NonTransactionalRepositoryTest.java:248) at easycare.dao.NonTransactionalRepositoryTest.createAndSaveSleepLab(NonTransactionalRepositoryTest.java:240) at easycare.alc.dao.remover.HstBulkPatientRemoverTest.setup(HstBulkPatientRemoverTest.java:143) at easycare.dao.TransactionWrapper.runWithinTransaction(TransactionWrapper.java:20) at easycare.dao.TransactionWrapper$$FastClassBySpringCGLIB$$be34760c.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) at easycare.dao.TransactionWrapper$$EnhancerBySpringCGLIB$$615ef719.runWithinTransaction(<generated>) at easycare.dao.NonTransactionalRepositoryTest.runWithinTransaction(NonTransactionalRepositoryTest.java:206) at easycare.alc.dao.remover.HstBulkPatientRemoverTest.setUpAfterDbClean(HstBulkPatientRemoverTest.java:136) at easycare.dao.NonTransactionalRepositoryTest.setUp(NonTransactionalRepositoryTest.java:192) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 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:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 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.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178) at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2933) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3524) at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:637) at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) at org.hibernate.jpa.event.internal.core.JpaMergeEventListener.saveWithGeneratedId(JpaMergeEventListener.java:56) at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:255) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:235) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:173) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:906) ... 84 more Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'contactInformation_id'. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:215) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1635) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:426) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:372) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5846) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1719) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:184) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:159) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:315) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ... 102 more {code} |
|