From e7cffe99d6d37f86fa1b3a983189d5890b462490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20P=C3=B6hler?= Date: Fri, 12 Nov 2021 14:46:39 +0100 Subject: [PATCH] FIX: Json deserialize references --- .../io/ebeaninternal/server/deploy/BeanDescriptor.java | 10 ++++++++++ .../server/deploy/BeanDescriptorJsonHelp.java | 3 +++ .../org/tests/text/json/TestTextJsonReferenceBean.java | 9 ++------- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index d675d9bf0..8d047e88e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -3038,6 +3038,10 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { return ebi.isReference() || referenceIdPropertyOnly(ebi); } + boolean hasIdPropertyOnly(EntityBeanIntercept ebi) { + return propertiesBaseScalar.length > 0 && ebi.hasIdOnly(idPropertyIndex); + } + public boolean referenceIdPropertyOnly(EntityBeanIntercept ebi) { return idOnlyReference && ebi.hasIdOnly(idPropertyIndex); } @@ -3055,6 +3059,12 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { return versionPropertyIndex > -1 && ebi.isLoadedProperty(versionPropertyIndex); } + void setReferenceIfIdOnly(EntityBeanIntercept ebi) { + if (hasIdPropertyOnly(ebi)) { + ebi.setReference(idPropertyIndex); + } + } + /** * Set the version value returning it in primitive long form. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java index b11c987bb..6eef2b06d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java @@ -152,6 +152,9 @@ final class BeanDescriptorJsonHelp { } if (contextBean == null) { readJson.beanVisitor(bean, unmappedProperties); + if (!isNullOrZero(id)) { + desc.setReferenceIfIdOnly(bean._ebean_getIntercept()); + } } if (path != null) { readJson.popPath(); diff --git a/ebean-test/src/test/java/org/tests/text/json/TestTextJsonReferenceBean.java b/ebean-test/src/test/java/org/tests/text/json/TestTextJsonReferenceBean.java index 0f0f66f02..95ce27683 100644 --- a/ebean-test/src/test/java/org/tests/text/json/TestTextJsonReferenceBean.java +++ b/ebean-test/src/test/java/org/tests/text/json/TestTextJsonReferenceBean.java @@ -47,15 +47,10 @@ public class TestTextJsonReferenceBean extends BaseTestCase { prodDesc.isReference(eb._ebean_getIntercept()); BeanState beanState = DB.beanState(refProd); - assertTrue(beanState.isNew()); + assertTrue(beanState.isReference()); String name = refProd.getName(); - assertNull(name); - - // Set to be 'loaded' to invoke lazy loading - beanState.setLoaded(); - String name2 = refProd.getName(); - assertNotNull(name2); + assertNotNull(name); } List orders = DB.find(Order.class)