diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/entity/CreateOnlyViewToEntityMapper.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/entity/CreateOnlyViewToEntityMapper.java deleted file mode 100644 index c747cb925b..0000000000 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/entity/CreateOnlyViewToEntityMapper.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2014 - 2021 Blazebit. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.blazebit.persistence.view.impl.entity; - -import com.blazebit.persistence.view.impl.EntityViewManagerImpl; -import com.blazebit.persistence.view.impl.accessor.AttributeAccessor; -import com.blazebit.persistence.view.impl.update.EntityViewUpdaterImpl; -import com.blazebit.persistence.view.impl.update.UpdateContext; -import com.blazebit.persistence.view.metamodel.Type; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * - * @author Christian Beikov - * @since 1.2.0 - */ -public class CreateOnlyViewToEntityMapper extends AbstractViewToEntityMapper { - - public CreateOnlyViewToEntityMapper(String attributeLocation, EntityViewManagerImpl evm, Class viewTypeClass, Set> readOnlyAllowedSubtypes, Set> persistAllowedSubtypes, Set> updateAllowedSubtypes, - EntityLoader entityLoader, AttributeAccessor viewIdAccessor, AttributeAccessor entityIdAccessor, boolean persistAllowed, EntityViewUpdaterImpl owner, String ownerMapping, Map localCache) { - super(attributeLocation, evm, viewTypeClass, readOnlyAllowedSubtypes, persistAllowedSubtypes, updateAllowedSubtypes, entityLoader, viewIdAccessor, entityIdAccessor, persistAllowed, owner, ownerMapping, localCache); - } - - @Override - public Object applyToEntity(UpdateContext context, Object entity, Object view) { - if (entity == null) { - return persist(context, entity, view); - } - - return entity; - } - - @Override - public Object flushToEntity(UpdateContext context, Object entity, Object view) { - if (entity == null) { - return persist(context, entity, view); - } - - return entity; - } - - @Override - public void loadEntities(UpdateContext context, List views) { - for (int i = 0; i < views.size(); i++) { - views.set(i, persist(context, null, views.get(i))); - } - } - - @Override - public Object loadEntity(UpdateContext context, Object view) { - return persist(context, null, view); - } - - @Override - public AttributeAccessor getViewIdAccessor() { - return null; - } - - @Override - public AttributeAccessor getEntityIdAccessor() { - return null; - } -} diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/EntityViewUpdaterImpl.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/EntityViewUpdaterImpl.java index 6a4b4da689..0904c8f4bf 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/EntityViewUpdaterImpl.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/EntityViewUpdaterImpl.java @@ -39,7 +39,6 @@ import com.blazebit.persistence.view.impl.collection.MapInstantiatorImplementor; import com.blazebit.persistence.view.impl.collection.RecordingList; import com.blazebit.persistence.view.impl.collection.RecordingMap; -import com.blazebit.persistence.view.impl.entity.CreateOnlyViewToEntityMapper; import com.blazebit.persistence.view.impl.entity.EmbeddableUpdaterBasedViewToEntityMapper; import com.blazebit.persistence.view.impl.entity.EntityIdLoader; import com.blazebit.persistence.view.impl.entity.EntityLoader; @@ -1232,23 +1231,7 @@ public void remove(UpdateContext context, Object viewId) { ownerMapping, localCache ); - } else if (shouldFlushPersists) { - viewToEntityMapper = new CreateOnlyViewToEntityMapper( - attributeLocation, - evm, - subviewType.getJavaType(), - readOnlyAllowedSubtypes, - persistAllowedSubtypes, - updateAllowedSubtypes, - null, - null, - entityIdAccessor, - shouldFlushPersists, - owner, - ownerMapping, - localCache - ); - } else if (shouldPassThrough(evm, viewType, attribute)) { + } else if (!shouldFlushPersists && shouldPassThrough(evm, viewType, attribute)) { viewToEntityMapper = new LoadOnlyViewToEntityMapper( EntityLoaders.referenceLoaderForAttribute(evm, localCache, subviewType, attribute), subviewIdAccessor, @@ -1263,7 +1246,7 @@ public void remove(UpdateContext context, Object viewId) { persistAllowedSubtypes, updateAllowedSubtypes, EntityLoaders.referenceLoaderForAttribute(evm, localCache, subviewType, attribute), - null, + subviewIdAccessor, entityIdAccessor, shouldFlushPersists, owner, diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/AbstractPluralAttributeFlusher.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/AbstractPluralAttributeFlusher.java index 207142fe37..5677b89c22 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/AbstractPluralAttributeFlusher.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/AbstractPluralAttributeFlusher.java @@ -425,9 +425,15 @@ protected final DirtyAttributeFlusher getElementOnlyFlusher(UpdateConte // Except when we use a query strategy here, we'd rather use update queries to do the update // We don't fetch if the force entity mode is active because that means, an entity is already given if (flushStrategy == FlushStrategy.ENTITY && !context.isForceEntity()) { - return partialFlusher(true, PluralFlushOperation.ELEMENT_ONLY, Collections.EMPTY_LIST, elementFlushers); + if (actions.isEmpty()) { + return partialFlusher(true, PluralFlushOperation.ELEMENT_ONLY, Collections.EMPTY_LIST, elementFlushers); + } + return partialFlusher(true, PluralFlushOperation.COLLECTION_REPLAY_AND_ELEMENT, actions, elementFlushers); } else { - return partialFlusher(false, PluralFlushOperation.ELEMENT_ONLY, Collections.EMPTY_LIST, elementFlushers); + if (actions.isEmpty()) { + return partialFlusher(false, PluralFlushOperation.ELEMENT_ONLY, Collections.EMPTY_LIST, elementFlushers); + } + return partialFlusher(false, PluralFlushOperation.COLLECTION_REPLAY_AND_ELEMENT, actions, elementFlushers); } } diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/CompositeAttributeFlusher.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/CompositeAttributeFlusher.java index 18679f260b..dc5b41cdfc 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/CompositeAttributeFlusher.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/CompositeAttributeFlusher.java @@ -432,7 +432,7 @@ public Query flushQuery(UpdateContext context, String parameterPrefix, UpdateQue Object[] initialState = ((DirtyStateTrackable) value).$$_getInitialState(); context.getInitialStateResetter().addState(initialState, initialState.clone()); - if (query == null) { + if (query == null && queryFactory != null) { query = queryFactory.createUpdateQuery(context, (MutableStateTrackable) ownerView, ownerFlusher); } for (int i = 0; i < state.length; i++) { diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/FusedCollectionIndexActions.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/FusedCollectionIndexActions.java index d5a218bee8..72a44cc0f2 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/FusedCollectionIndexActions.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/FusedCollectionIndexActions.java @@ -18,6 +18,7 @@ import com.blazebit.persistence.view.impl.collection.ListAction; import com.blazebit.persistence.view.impl.update.UpdateContext; +import com.blazebit.persistence.view.spi.type.DirtyTracker; import java.util.ArrayList; import java.util.Collection; @@ -82,7 +83,7 @@ public FusedCollectionIndexActions(List> collectionActio appendedObjectMap.add(entry); } else { ReplaceOperation replaceOperation = new ReplaceOperation(index, entry.getKey()); - if (!addTranslateOperation(translateOperations, index, Integer.MAX_VALUE, 1, null, replaceOperation)) { + if (addTranslateOperation(translateOperations, index, Integer.MAX_VALUE, 1, null, replaceOperation)) { replaceOperations.add(replaceOperation); } } @@ -194,7 +195,8 @@ private static boolean addTranslateOperation(List trans // A remove followed an insert or the other way round allow to remove the translation operation translateOperations.remove(i); replaceOperation.oldObject = indexTranslateOperation.removeOperations.get(0).removedObject; - return replaceOperation.oldObject == replaceOperation.newObject; + Object value = replaceOperation.newObject; + return replaceOperation.oldObject != value || value instanceof DirtyTracker && ((DirtyTracker) value).$$_isDirty(); } else if (indexDiff == 1 && indexTranslateOperation.endIndex == endIndex) { // Neighbouring index translations with the same endIndex are merged List newList; @@ -206,18 +208,18 @@ private static boolean addTranslateOperation(List trans newList.add(removeOperation); } translateOperations.set(i, new IndexTranslateOperation(Math.min(indexTranslateOperation.startIndex, startIndex), endIndex, indexTranslateOperation.offset + offset, newList)); - return false; + return true; } else { translateOperations.set(i, new IndexTranslateOperation(indexTranslateOperation.startIndex, startIndex, indexTranslateOperation.offset, indexTranslateOperation.removeOperations)); translateOperations.add(i + 1, new IndexTranslateOperation(startIndex, endIndex, offset, removeOperation == null ? new ArrayList() : new ArrayList<>(Collections.singletonList(removeOperation)))); - return false; + return true; } } } translateOperations.add(new IndexTranslateOperation(startIndex, endIndex, offset, removeOperation == null ? new ArrayList() : new ArrayList<>(Collections.singletonList(removeOperation)))); } - return false; + return true; } private static int applyIndexTranslations(List indexTranslateOperations, int index) { diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/IndexedListAttributeFlusher.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/IndexedListAttributeFlusher.java index e66b99d654..d8832e8ac5 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/IndexedListAttributeFlusher.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/IndexedListAttributeFlusher.java @@ -348,13 +348,13 @@ protected void addFlatViewElementFlushActions(UpdateContext context, TypeDescrip // By default, since the view is dirty, we start with the state UPDATED and go through state transitions // based on the containment of the view in the added/removed objects collections of the actions EntryState state = EntryState.UPDATED; - Object replacedObject = null; + Object replacedObject = element; for (CollectionAction action : actions) { Collection removedObjects = action.getRemovedObjects(); if (identityContains(removedObjects, element)) { if (identityContains(action.getAddedObjects(), element)) { // This is a ListSetAction where the old and new object are the same instances - replacedObject = null; + replacedObject = element; state = EntryState.UPDATED; } else { state = state.onRemove(); @@ -373,9 +373,9 @@ protected void addFlatViewElementFlushActions(UpdateContext context, TypeDescrip // If the element was UPDATED and there is no replacedObject, // this means that this really was just a mutation of the view // and there is no action that would flush the object changes already - if (state == EntryState.UPDATED && replacedObject == null) { + if (state == EntryState.UPDATED && replacedObject == element) { // Using last = false is intentional to actually get a proper update instead of a delete and insert - actions.add(new ListSetAction<>(i, false, element, null)); + actions.add(new ListSetAction<>(i, false, element, element)); } } } diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/SubviewAttributeFlusher.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/SubviewAttributeFlusher.java index ee79f7168a..3c779e14a0 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/SubviewAttributeFlusher.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/update/flush/SubviewAttributeFlusher.java @@ -604,7 +604,11 @@ public DirtyAttributeFlusher, E, V> getDirtyFlushe boolean needsUpdate = update && !viewIdEqual(initial, current); // If the reference changed, we don't need to load the old reference if (initial != current && needsUpdate) { - return new SubviewAttributeFlusher<>(this, false, (V) current, needsUpdate, null); + DirtyAttributeFlusher flusher = null; + if (current instanceof MutableStateTrackable) { + flusher = (DirtyAttributeFlusher) viewToEntityMapper.getNestedDirtyFlusher(context, (MutableStateTrackable) current, this); + } + return new SubviewAttributeFlusher<>(this, false, (V) current, needsUpdate, flusher); } // If the initial and current reference are null, no need to do anything further diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewCollectionsTest.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewCollectionsTest.java index 1188293b96..9a6ba9363a 100644 --- a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewCollectionsTest.java +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewCollectionsTest.java @@ -20,11 +20,14 @@ import com.blazebit.persistence.testsuite.base.jpa.category.NoDatanucleus; import com.blazebit.persistence.testsuite.base.jpa.category.NoEclipselink; import com.blazebit.persistence.testsuite.entity.Document; +import com.blazebit.persistence.testsuite.entity.IntIdEntity; import com.blazebit.persistence.testsuite.entity.NameObject; import com.blazebit.persistence.view.FlushMode; import com.blazebit.persistence.view.FlushStrategy; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.update.AbstractEntityViewUpdateDocumentTest; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityCreateView; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityIdView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableDocumentWithCollectionsView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableNameObjectView; import org.junit.Assert; @@ -61,6 +64,8 @@ public static Object[][] combinations() { @Override protected void registerViewTypes(EntityViewConfiguration cfg) { cfg.addEntityView(UpdatableNameObjectView.class); + cfg.addEntityView(IntIdEntityIdView.class); + cfg.addEntityView(IntIdEntityCreateView.class); } @Override @@ -172,6 +177,43 @@ public void testUpdateRemoveNull() { assertSubviewEquals(doc1.getNames(), docView.getNames()); } + @Test + public void testAddCollectionElementWithNewObject() { + // Given + final UpdatableDocumentWithCollectionsView docView = getDoc1View(); + clearQueries(); + + // When + IntIdEntityCreateView intIdEntity = evm.create(IntIdEntityCreateView.class); + intIdEntity.setName("test"); + docView.getNames().get(0).setIntIdEntity(intIdEntity); + update(docView); + + // Then + // Assert that the document and the people are loaded i.e. a full fetch + // Finally the person is updated because the intIdEntity changed + AssertStatementBuilder builder = assertUnorderedQuerySequence(); + + if (!isQueryStrategy()) { + fullFetch(builder); + } + + if (version || isFullMode() && isQueryStrategy()) { + builder.update(Document.class); + } + if (isFullMode() || !isQueryStrategy() && !supportsIndexedInplaceUpdate()) { + builder.delete(Document.class, "names") + .insert(Document.class, "names"); + } else { + builder.update(Document.class, "names"); + } + builder.insert(IntIdEntity.class); + builder.validate(); + + assertNoUpdateAndReload(docView); + assertEquals(intIdEntity.getId(), doc1.getNames().get(0).getIntIdEntity().getId()); + } + public static void assertSubviewEquals(Collection persons, Collection personSubviews) { if (persons == null) { assertNull(personSubviews); @@ -197,10 +239,14 @@ public static void assertSubviewEquals(Collection persons, Collectio @Override protected AssertStatementBuilder fullFetch(AssertStatementBuilder builder) { - return builder.assertSelect() + builder.assertSelect() .fetching(Document.class) .fetching(Document.class, "names") .and(); + if (doc1.getNames().get(0).getIntIdEntity() != null) { + builder.select(IntIdEntity.class); + } + return builder; } @Override diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewMapsTest.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewMapsTest.java index 1d72897fb0..403c4dc4a8 100644 --- a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewMapsTest.java +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewMapsTest.java @@ -25,6 +25,8 @@ import com.blazebit.persistence.view.FlushStrategy; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.update.AbstractEntityViewUpdateDocumentTest; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityCreateView; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityIdView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableDocumentWithMapsView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableNameObjectView; import org.junit.Assert; @@ -60,6 +62,8 @@ public static Object[][] combinations() { @Override protected void registerViewTypes(EntityViewConfiguration cfg) { cfg.addEntityView(UpdatableNameObjectView.class); + cfg.addEntityView(IntIdEntityIdView.class); + cfg.addEntityView(IntIdEntityCreateView.class); } @Override diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewTest.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewTest.java index aa4b863dcd..524ecf7d4b 100644 --- a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewTest.java +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/EntityViewUpdateSimpleMutableFlatViewTest.java @@ -24,6 +24,8 @@ import com.blazebit.persistence.view.FlushStrategy; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.update.AbstractEntityViewUpdateDocumentTest; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityCreateView; +import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.IntIdEntityIdView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableDocumentView; import com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model.UpdatableNameObjectView; import org.junit.Assert; @@ -54,6 +56,8 @@ public static Object[][] combinations() { @Override protected void registerViewTypes(EntityViewConfiguration cfg) { cfg.addEntityView(UpdatableNameObjectView.class); + cfg.addEntityView(IntIdEntityIdView.class); + cfg.addEntityView(IntIdEntityCreateView.class); } @Test diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityCreateView.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityCreateView.java new file mode 100644 index 0000000000..e6631dbcf4 --- /dev/null +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityCreateView.java @@ -0,0 +1,36 @@ +/* + * Copyright 2014 - 2021 Blazebit. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model; + +import com.blazebit.persistence.testsuite.entity.IntIdEntity; +import com.blazebit.persistence.view.CreatableEntityView; +import com.blazebit.persistence.view.EntityView; + +/** + * + * @author Christian Beikov + * @since 1.6.4 + */ +@CreatableEntityView +@EntityView(IntIdEntity.class) +public interface IntIdEntityCreateView extends IntIdEntityIdView { + + public String getName(); + + public void setName(String name); + +} diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityIdView.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityIdView.java new file mode 100644 index 0000000000..a7fff0d5d0 --- /dev/null +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/IntIdEntityIdView.java @@ -0,0 +1,34 @@ +/* + * Copyright 2014 - 2021 Blazebit. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model; + +import com.blazebit.persistence.testsuite.entity.IntIdEntity; +import com.blazebit.persistence.view.EntityView; +import com.blazebit.persistence.view.IdMapping; + +/** + * + * @author Christian Beikov + * @since 1.6.4 + */ +@EntityView(IntIdEntity.class) +public interface IntIdEntityIdView { + + @IdMapping + public Integer getId(); + +} diff --git a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/UpdatableNameObjectView.java b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/UpdatableNameObjectView.java index 9cf6a33b0d..1cd712ad55 100644 --- a/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/UpdatableNameObjectView.java +++ b/entity-view/testsuite/src/test/java/com/blazebit/persistence/view/testsuite/update/flatview/simple/mutable/model/UpdatableNameObjectView.java @@ -17,8 +17,10 @@ package com.blazebit.persistence.view.testsuite.update.flatview.simple.mutable.model; import com.blazebit.persistence.testsuite.entity.NameObject; +import com.blazebit.persistence.view.CascadeType; import com.blazebit.persistence.view.EntityView; import com.blazebit.persistence.view.UpdatableEntityView; +import com.blazebit.persistence.view.UpdatableMapping; /** * @@ -32,4 +34,9 @@ public interface UpdatableNameObjectView { public String getPrimaryName(); public void setPrimaryName(String primaryName); + + @UpdatableMapping(cascade = { CascadeType.PERSIST }) + public IntIdEntityIdView getIntIdEntity(); + + public void setIntIdEntity(IntIdEntityIdView intIdEntity); } diff --git a/integration/jackson/src/main/java/com/blazebit/persistence/integration/jackson/EntityViewAwareObjectMapper.java b/integration/jackson/src/main/java/com/blazebit/persistence/integration/jackson/EntityViewAwareObjectMapper.java index 5e722a451b..eaa74dce21 100644 --- a/integration/jackson/src/main/java/com/blazebit/persistence/integration/jackson/EntityViewAwareObjectMapper.java +++ b/integration/jackson/src/main/java/com/blazebit/persistence/integration/jackson/EntityViewAwareObjectMapper.java @@ -47,6 +47,10 @@ public class EntityViewAwareObjectMapper { private final EntityViewManager entityViewManager; private final ObjectMapper objectMapper; + public EntityViewAwareObjectMapper(final EntityViewManager entityViewManager, final ObjectMapper objectMapper) { + this(entityViewManager, objectMapper, null); + } + public EntityViewAwareObjectMapper(final EntityViewManager entityViewManager, final ObjectMapper objectMapper, final EntityViewIdValueAccessor entityViewIdValueAccessor) { this.entityViewManager = entityViewManager; SimpleModule module = new SimpleModule();