簡體   English   中英

升級后,@MapsId 在保存現有實體時拋出錯誤,但其他工作正常

[英]Post-upgrade, @MapsId is throwing an error when saving an existing entity, but otherwise works fine

我正在將Spring Boot 1.5.21 項目 (Java 8u221)升級到Spring Boot 2.1.9 (Java 11.0.2-open) In both cases we are using a gradle build with the spring boot starters and dependency resolver so the versions of the underlying Spring, JPA, and Hibernate libraries are spring-managed.

該項目具有可選的一對一映射,其中子實體從父實體生成的 ID 中獲取其 ID。 Spring Boot 1版本項目中,關系配置如下:

@Entity
@Table(name = "PARENT_OBJECT", schema = "MYSCHEMA")
public class ParentObject implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PARENT_OBJECT_ID_SEQ")
    @SequenceGenerator(name = "PARENT_OBJECT_ID_SEQ", sequenceName = "MYSCHEMA.PARENT_OBJECT_ID_SEQ")
    protected Long id;

    @OneToOne(optional = true, mappedBy = "parentObject", cascade = CascadeType.ALL, orphanRemoval = true)
    @Valid
    protected ChildObject childObject;

    // Other fields and methods
}

@Entity
@Table(name = "CHILD_OBJECT", schema = "MYSCHEMA")
public class ChildObject implements Serializable {
    @Id
    @Column(name = "parent_object_id", unique = true, nullable = false, insertable = true, updatable = false)
    private Long parentObjectId;

    @OneToOne
    @MapsId
    @PrimaryKeyJoinColumn
    @JsonIgnore
    private ParentObject parentObject;

    // Other fields and methods
}

當我更新到Spring Boot 2時,我不得不更新很多 JPA 設置,特別抱怨的一件事是生成的查詢正在尋找“PARENTOBJECT_ID”而不是“PARENT_OBJECT_ID”,所以我調查了一下位,找到了一篇文章,解釋了如何使用 @JoinColumn 修復一對一映射的列名,並將@JoinColumn字段的子對象注釋更新為以下內容:

@OneToOne
@MapsId
@JoinColumn(name = "parent_object_id")
@JsonIgnore
private ParentObject parentObject;

我完全刪除了@PrimaryKeyJoinColumn ,因為文檔似乎建議您應該使用@MapsId如果您希望 Hibernate 處理 ID 的分配,並且如果您要自己管理它們,那就是您使用@PrimaryKeyJoinColumn的時候。

此配置對我的所有測試都適用,除了 2:Controller 的 UPDATE 集成測試(POST 測試工作得很好,當 ParentObject 第一次與其關聯的 ChildObject 一起創建時)。 我僅通過這兩個測試得到的錯誤是

org.springframework.orm.jpa.JpaSystemException:試圖從 null 一對一屬性 [orgmysub.mycompany. 嵌套異常是 org.hibernate.id.IdentifierGenerationException: 試圖從 null 一對一屬性分配 id [org.mycompany.myproject.mymodule.mysubmodule.ChildObject.parentObject]

奇怪的是,這些實體及其關聯的所有存儲庫集成測試都通過了,以及所有其他 controller 集成測試,包括新的ParentObject與其新的ChildObject一起發布的測試。 我到處尋找可能的解決方案,但我閱讀的每篇文章似乎都建議我使用的配置應該可以工作。 我還嘗試了替代配置,這些配置建議使用@PrimaryKeyJoinColumn並自己設置 ID 字段,在ChildObject的 ID 上使用 ID 生成器(即使@MapsId的目的是告訴系統使用ParentObject的 ID),通常我最終會遇到更多失敗的測試,並出現以下錯誤:

org.springframework.orm.jpa.JpaSystemException:此 class 的 ids 必須手動分配;調用 save().mymodule.mysubmodule.myproject 嵌套異常是 org.hibernate.id.IdentifierGenerationException:此 class 的 ID 必須在調用 save() 之前手動分配:org.mycompany.myproject.mymodule.mysubmodule.ChildObject

盡管有時我會遇到無法“從 null 分配 id”的原始錯誤。 在這一點上,我不知道這是如何配置不正確或有什么其他因素在搞砸事情 在這一點上,我願意嘗試任何和所有建議。

為了完整起見,以下是應用程序中的一堆代碼片段。 堆棧跟蹤中的相關行號帶有注釋。 我省略了 controller 代碼,因為它沒有什么特別之處; POST 和 PUT 方法都調用相同的服務方法; 它們只是在不同的端點,PUT 在調用服務保存方法之前首先檢查數據庫中是否存在 object。 這是調用 ParentObject 的ParentObject存儲庫的服務方法:

@Service
@Transactional(readOnly = true)
public class ParentObjectServiceImpl implements ParentObjectService {
    // other fields and other methods

    @Autowired
    private ParentObjectRepository parentObjectRepository;

    @Transactional(readOnly = false)
    @Override
    public ParentObject saveParentObject(final ParentObject parentObject) {
        parentObject.prepForPersistence();
        return parentObjectRepository.save(parentObject); //Line 93
    }
}

這是我的 JPA 存儲庫:

public interface ParentObjectRepository extends CrudRepository<ParentObject, Long> {
    // custom methods, no override for save though
}

這是 ParentObject 的ParentObject prepForPersistence()方法:

public void prepForPersistence() {
    if(childObject != null) {
        childObject.setParentObject(this);
        // In some iterations of the code in trying to solve this, I also had the following line
        //childObject.setParentObjectId(this.id);
    }
}

以下是其中兩項測試(一項通過,一項失敗):

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApplication.class)
@WebAppConfiguration
// This profile disabled csrf for testing, and sets some env variables
@ActiveProfiles("integration-test")
@Transactional
public class ParentObjectControllerTest {
    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(context)
            .apply(springSecurity())
            .build();
    } 

    // This test PASSES
    @Test
    @WithMockUser(roles = {"MY_APP_ADMIN"}, username = TEST_USER)
    @Sql(scripts = "/db-scripts/bootstrap.sql")
    public void testPostParentObjectWithChildObject() {
        final ChildObject childObject = new ChildObject();
        // set some properties on childObject that don't relate to ParentObject

        final ParentObject parentObject = new ParentObject();
        // set some properties on parentObject that don't relate to ChildObject
        parentObject.setChildObject(childObject);

        final ParentObject result = given().mockMvc(mockMvc).contentType(ContentType.JSON)
            .and().body(item).log().all()
            .when().post("/parent-objects")
            .then().log().all().statusCode(201).contentType(ContentType.JSON)
            .and().body(matchesJsonSchemaInClasspath("json-schemas/parent-object.json"))
            .and().body("username", equalTo(TEST_USER))
            .extract().as(ParentObject.class);

        assertThat(result.getId(), is(notNullValue()));
        assertThat(result.getChildObject().getParentObjectId(), is(result.getId()));
    }

    // This test FAILS with the 'attempted to assign id from null one-to-one property' error
    @Test
    @WithMockUser(roles = {"MY_APP_ADMIN"}, username = TEST_USER)
    // Inserts a ParentObject record with ID -1
    @Sql(scripts = "/db-scripts/bootstrap.sql")
    public void testPutParentObjectWithChildObject() {
        final ChildObject childObject = new ChildObject();
        // set some properties on childObject that don't relate to ParentObject

        final Long EXISTING_ID = -1L;
        final ParentObject parentObject = new ParentObject();
        parentObject.setId(EXISTING_ID);
        parentObject.setChildObject(childObject);

        final ParentObject result = given().mockMvc(mockMvc).contentType(ContentType.JSON)
            .and().body(item).log().all()
            .when().put("/parent-objects/{parentObjectId}", parentObject.getId()) //line 260
            .then().log().all().statusCode(200)
            .extract().as(ParentObject.class);

        assertThat(result.getId(), is(EXISTING_ID));
        assertThat(result.getChildObject().getParentObjectId(), is(EXISTING_ID));
}

這是完整的堆棧跟蹤:

Responding with HTTPStatus=INTERNAL_SERVER_ERROR due to the following error: org.springframework.orm.jpa.JpaSystemException: attempted to assign id from null one-to-one property [org.mycompany.myproject.mymodule.mysubmodule.ChildObject.parentObject]; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [org.mycompany.myproject.mymodule.mysubmodule.ChildObject.parentObject] at org.springframework.orm.jpa.vendor.HibernateJpaDialect .convertHibernateAccessException(HibernateJpaDialect.java:352) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:254) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(C hainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) at org.springframework.aop .framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:144) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186)在 org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcess or$ExposeRepositoryInvocationInterceptor.invoke(CrudMethodMetadataPostProcessor.java:364) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) at org.springframework.aop.framework .ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Z93F725A07423FE1C889F448B33D21F46) 236D9A2D102C5FE6AD1C50DA4BEC50Z.sun.proxy.$Proxy249.save(Unknown Source) at org.mycompany.myproject.mymodule.ParentObjectServiceImpl.saveParentObject(ParentObjectServiceImpl.java:93) at org.mycompany.myproject.mymodule.ParentObjectServiceImpl$$FastClassBySpringCGLIB$$86531367.invoke () at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750) at org.springframework.aop.framework .ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java: 98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) at org.mycompany.myproject.mymodule .ParentObjectServiceImpl$$EnhancerBySpringCGLIB$$d3a0c3ee.saveChecklistItem() at org.mycompany.myproject.mymodule.ParentObjectController.putParentObject(ParentObjectController.java:78) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at Z93F725A07423FE1C889F44 8B33D21F46Z.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method. support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method. annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal( lerAdapter.java:798) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org .springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet .java:920) at javax.servlet.http.HttpServlet.service(HttpServlet.Z93F725A07423FE1C889F448B33D251F46Z:257AEC900.Z568) EB7AC2C984033E06189DZ.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 750) at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) at org.springframework.security.web .FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainPro xy.java:334) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java: 91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.springframework.security .web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.Z2567A5EC9705EB74AC2C984033EZF CFB511982E4424E0E250A9557Z.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter. java:111) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) at org.springframework .security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.Z93F725A074 23FE1C889F448B33D21F46Z:334) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework .security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain .doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authenticati on.logout.LogoutFilter.doFilter(LogoutFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter. java:97) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security .web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) at org.springframework.web.filter.OncePerRequestFil ter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java: 105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) at org在 org.springframework.security .web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java :178) at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) at io.restassured.module. mockmvc.internal.MockMvcRequestSenderImpl.performRequest(MockMvcRequestSenderImpl.java:218) 在 io.restassured.module.mockmvc.internal.MockMvcRequestSenderIm pl.sendRequest(MockMvcRequestSenderImpl.java:447) at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java:504) at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java: 100) at org.mycompany.myproject.mymodule.ParentObjectControllerTest.testPutParentObjectWithChildObject(ParentObjectControllerTest.java:260) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect. NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invokeC3F82590742FE1F87590742FE1.Z 89F448B33D21F46Z:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) 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.InvokeMethod.evaluate( InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) at org.springframeworkspring .test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.springframework.test.context.junit4 .statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 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. s pringframework.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.e valuate(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.gradle .api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) at org.gradle .api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.Z93F725A07423FE1C889 F448B33D21F46Z:38) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java: 51) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.在 java.base/java.lang.reflect.Method.invoke(Method. java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch .ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy5.processTestClass(Unknown Source) at org. gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118) at java.base/jdk.interna l.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal. dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182 ) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412 ) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.base/java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.Z8ED1A771BC236C287AD93C699B FDD2D7Z.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [org.mycompany.myproject.mymodule.mysubmodule.ChildObject.parentObject] at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:90) at org.hibernate.event.internal .AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:119) at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:287) at org.hibernate.event.internal .DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:259) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:191) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:927) at org. hibernate.internal.SessionImpl.merge(SessionImpl.java:897) at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261) at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java :490) at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:415) at org.ZCB1F008EEBF5012C4EF9A2C36E574DcascadeAssociation(Cascade.java:415) .java:216) at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:149) at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:532) at org.hibernate.event. internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:361) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:188) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:72) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:905) at org.hibernate.internal.SessionImpl.merge( SessionImpl.java:891) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:310) at com.sun.proxy.$Proxy214.merge(Unknown Source) at org.springframework.data.jpa.repository.s upport.SimpleJpaRepository.save(SimpleJpaRepository.java:538) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359) at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200) at org.springframework.data.repository.c ore.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:644) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframewor k.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)... 140 more

Thanks in advance for suggestions and help!

我認為這是一個錯誤,但如果有人有解決方法,我仍然對解決方法感興趣 我最初在 hibernate 上發現了一個似乎與問題匹配的錯誤,但它被注冊為僅影響 5.2 系列並標記為“已修復”,並且由於我們的項目使用的是 5.3 系列,所以我繼續前進。 雖然從 spring 方面挖掘提交的錯誤,但面包屑線索將我引向了這個 5.3 系列錯誤: https://hibernate.atlassian.net/browse/HHH-13413 ,它鏈接回最初發現的 5.2 系列錯誤與 5.3 的描述相反,這似乎表明自 5.2 系列以來這一直是一個問題,並且不應該在 5.3 系列中起作用,因為不僅 5.3 系列錯誤被標記為 5.2 的副本系列錯誤,當我仔細查看 5.2 錯誤時,它表示它的修復版本直到 5.4: https://hibernate.atlassian.net/browse/HHH-12436

So I'll be trying downgrading to the last 5.2 series that worked, and upgrading to the 5.4 series... I'm just not sure how either of those will play with the rest of the spring data jpa functionality and may be a big問題本身。

更新:除了遇到問題,因為我們正在使用 java 11 ( https://hibernate.atlassian.net/browse/HHH-12924 -> 我必須使用 javassist:3.23.0-GA 來獲取 hibernate:3.23.0-GA 5.2.13.Final to work),降級成功使一對一映射再次工作。 所有其他測試也通過了。 但是,我沒有對此解決方案進行廣泛的測試,因為我更喜歡基於升級的解決方案。

更新 2:能夠升級以升級到 Spring Boot 2.2.0(使用 Hibernate 5.4,這是修復了一對一映射的特定錯誤的地方),它需要對我的序列進行一些更改; 但升級並不太痛苦,甚至不需要使用降級標志。 如果碰巧您的映射問題沒有得到解決。 有一個“使用 5.2 行為”標志,因為他們仍在解決各種映射場景的問題:有關其 5.4 遷移說明的更多詳細信息: https://github.com/hibernate/hibernate-orm/blob /61cddad76d5bba951805fa7ed90cc149d404841c/migration-guide.adoc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM