<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Technical FAQ with examples</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>Recent changes to Technical FAQ with examples</description><atom:link href="https://sourceforge.net/p/javaobjectmerger/wiki/Technical%20FAQ%20with%20examples/feed" rel="self"/><language>en</language><lastBuildDate>Mon, 17 Nov 2014 20:07:23 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/javaobjectmerger/wiki/Technical%20FAQ%20with%20examples/feed" rel="self" type="application/rss+xml"/><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v46
+++ v47
@@ -7,7 +7,7 @@
 &lt;h4&gt;How to create merging context?&lt;/h4&gt;
 It's very easy:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;import&lt;/span&gt; net.sf.brunneng.jom;  &amp;lt;BR/&amp;gt;...  &amp;lt;BR/&amp;gt;IMergingContext context = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MergingContext();&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;import&lt;/span&gt; net.sf.brunneng.jom;  &lt;br /&gt;...  &lt;br /&gt;IMergingContext context = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MergingContext();&lt;/div&gt;
 &lt;br /&gt;

 &lt;h4&gt;Should the classes of object be the same to perform mapping?&lt;/h4&gt;
@@ -30,7 +30,7 @@

 Use annotation **@Mapping** (in package net.sf.brunneng.jom.annotations). Put it on field, or getter, or setter of one of property, and specify **associated path** to corresponding field. For example:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@Mapping(&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;) &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name1;&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@Mapping(&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;) &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name1;&lt;/div&gt;
 &lt;br /&gt;

 Or from code:
@@ -56,16 +56,16 @@
     - conversion string to enum, by name of enum constant.
     - conversion between enums, by name of constants.&lt;br /&gt;
 b) You can provide your own type converter.
-&lt;div style="font-family: Courier New;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyDateTimeConverter &lt;span style="color: Blue;"&gt;implements&lt;/span&gt; TypeConverter {  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) {  &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; (fromClass.equals(java.util.Date.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;) &amp;amp;&amp;amp; (toClass.equals(DateTime.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;);  &amp;lt;BR/&amp;gt;   }  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) {  &amp;lt;BR/&amp;gt;      &lt;span style="color: Green;"&gt;// implementation here &lt;/span&gt; &amp;lt;BR/&amp;gt;   }  &amp;lt;BR/&amp;gt;} &lt;/div&gt;
+&lt;div style="font-family: Courier New;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyDateTimeConverter &lt;span style="color: Blue;"&gt;implements&lt;/span&gt; TypeConverter {  &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) {  &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; (fromClass.equals(java.util.Date.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;) &amp;amp;&amp;amp; (toClass.equals(DateTime.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;);  &lt;br /&gt;   }  &lt;br /&gt; &lt;br /&gt;   Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) {  &lt;br /&gt;      &lt;span style="color: Green;"&gt;// implementation here &lt;/span&gt; &lt;br /&gt;   }  &lt;br /&gt;} &lt;/div&gt;

 And it will used by this **context** every time when there are need to convert Date to DateTime.

 c) You can specify property converter, when conversion is not need everywhere but only for some property.
 Using **@Converter** annotation:
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; WeekDayConverter &lt;span style="color: Blue;"&gt;implements&lt;/span&gt; PropertyConverter {  &amp;lt;BR/&amp;gt;   &lt;span style="color: Green;"&gt;// implementation here &lt;/span&gt; &amp;lt;BR/&amp;gt;}  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; PersonDTO { &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   @Mapping(&lt;span style="color: Maroon;"&gt;"birthDate"&lt;/span&gt;)  &amp;lt;BR/&amp;gt;   @Converter(WeekDayConverter.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;)  &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;int&lt;/span&gt; birthDayOfWeek;  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;}&lt;/div&gt;
-
-Or from code:
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(PersonDTO.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"birthDayOfWeek"&lt;/span&gt;).setConverter( &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;new&lt;/span&gt; ConverterMetadata(WeekDayConverter.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;));&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; WeekDayConverter &lt;span style="color: Blue;"&gt;implements&lt;/span&gt; PropertyConverter {  &lt;br /&gt;   &lt;span style="color: Green;"&gt;// implementation here &lt;/span&gt; &lt;br /&gt;}  &lt;br /&gt; &lt;br /&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; PersonDTO { &lt;br /&gt;... &lt;br /&gt; &lt;br /&gt;   @Mapping(&lt;span style="color: Maroon;"&gt;"birthDate"&lt;/span&gt;)  &lt;br /&gt;   @Converter(WeekDayConverter.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;)  &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;int&lt;/span&gt; birthDayOfWeek;  &lt;br /&gt; &lt;br /&gt;... &lt;br /&gt;}&lt;/div&gt;
+
+Or from code:
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(PersonDTO.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"birthDayOfWeek"&lt;/span&gt;).setConverter( &lt;br /&gt;       &lt;span style="color: Blue;"&gt;new&lt;/span&gt; ConverterMetadata(WeekDayConverter.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;));&lt;/div&gt;
 &lt;br /&gt;

 &lt;h4&gt;Can I use context.setConverters() method to set my type converters, and whether this overrides default type converters?&lt;/h4&gt;
@@ -74,10 +74,10 @@
 &lt;h4&gt;Is it possible to map several properties into one?&lt;/h4&gt;

 Easy! Use annotation **@MapFromMany** with **@Converter**. In @MapFromMany you specify names of fields to be mapped on current field. In @Converter - class which take collection of fields, and make one field from  them by some logic. For example:
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; PersonDTO {  &amp;lt;BR/&amp;gt;...  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   @MapFromMany(srcProperties = {&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;"secondName"&lt;/span&gt;}) &amp;lt;BR/&amp;gt;   @Converter(NamesJoiner.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;); &lt;span style="color: Green;"&gt;// &amp;lt;- your class with logic of string joining.&lt;/span&gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String fullName; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; PersonDTO {  &lt;br /&gt;...  &lt;br /&gt; &lt;br /&gt;   @MapFromMany(srcProperties = {&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;"secondName"&lt;/span&gt;}) &lt;br /&gt;   @Converter(NamesJoiner.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;); &lt;span style="color: Green;"&gt;// &amp;lt;- your class with logic of string joining.&lt;/span&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String fullName; &lt;br /&gt; &lt;br /&gt;... &lt;br /&gt;}&lt;/div&gt;

 or from code:
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;BeanPropertyMetadata p = context.forBeansOfClass(PersonDTO.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"fullName"&lt;/span&gt;); &amp;lt;BR/&amp;gt;p.setConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; ConverterMetadata(NamesJoiner.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;)); &lt;span style="color: Green;"&gt;// &amp;lt;- your converter class&lt;/span&gt; &amp;lt;BR/&amp;gt;p.setMapping(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; MappingMetadata(Arrays.asList(&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;"secondName"&lt;/span&gt;)));&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;BeanPropertyMetadata p = context.forBeansOfClass(PersonDTO.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"fullName"&lt;/span&gt;); &lt;br /&gt;p.setConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; ConverterMetadata(NamesJoiner.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;)); &lt;span style="color: Green;"&gt;// &amp;lt;- your converter class&lt;/span&gt; &lt;br /&gt;p.setMapping(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; MappingMetadata(Arrays.asList(&lt;span style="color: Maroon;"&gt;"firstName"&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;"secondName"&lt;/span&gt;)));&lt;/div&gt;

 Note: MapFromMany works only in one direction - you can map only from many properties into one, but not vise versa.

@@ -89,12 +89,12 @@

 Use annotation **@Identifier** to mark property which is considered to be indentifier of entity. And mapper will compare beans with equal identifiers. If identifier is not specified then beans will be compared by equals method of it.

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@Identifier &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; Integer identifier;&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@Identifier &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; Integer identifier;&lt;/div&gt;
 &lt;br /&gt;

 Or you can specify from code, that for all beans all properties which name is "identifier" are identifiers!

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().ofNames( &amp;lt;BR/&amp;gt;    &lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;).setIdentifier(&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().ofNames( &lt;br /&gt;    &lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;).setIdentifier(&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
 &lt;br /&gt;

 This code apply metadata for all beans which extends from Object.class and for all properties with name "identifier". **forMatchedProperties()** is very powerful mechanism. It allows to set metadata on properties which are lazy matched to specified criteria. It can greatly reduce amount of metadata code.
@@ -110,7 +110,7 @@
 &lt;h4&gt;What if during mapping of collection I need to update just links to some entities (not content)?&lt;/h4&gt;
 You can do it from code with creation of local merging context:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Author { &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;Book&amp;gt; books; &amp;lt;BR/&amp;gt;   ... &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; AuthorDTO { &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;BookDTO&amp;gt; books; &amp;lt;BR/&amp;gt;   ... &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;IMergingContext localContext = context.localCopy(); &amp;lt;BR/&amp;gt;localContext.forBeansOfClass(Book.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).mapOnly(&lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;); &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;Author author = localContext.map(authorDto, Author.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;);&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Author { &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;Book&amp;gt; books; &lt;br /&gt;   ... &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; AuthorDTO { &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;BookDTO&amp;gt; books; &lt;br /&gt;   ... &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;IMergingContext localContext = context.localCopy(); &lt;br /&gt;localContext.forBeansOfClass(Book.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).mapOnly(&lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;); &lt;br /&gt; &lt;br /&gt;Author author = localContext.map(authorDto, Author.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;);&lt;/div&gt;
 &lt;br /&gt;

 We create local merging context because don't want to harm original mapping for BookDTO.class. But in local merging context we can do anything, and we mark that for books we want to: **mapOnly("identifier")**.
@@ -118,7 +118,7 @@
 &lt;h4&gt;What if I need some postprocessing of bean, after finishing of mapping?&lt;/h4&gt;
 Use annotation **@OnBeanMappingFinished** to mark method of bean which will be called after finishing mapping of bean:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Person { &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;@OnBeanMappingFinished &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; onAfterMapping() { &amp;lt;BR/&amp;gt;  &lt;span style="color: Green;"&gt;// your logic here&lt;/span&gt; &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Person { &lt;br /&gt;... &lt;br /&gt; &lt;br /&gt;@OnBeanMappingFinished &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; onAfterMapping() { &lt;br /&gt;  &lt;span style="color: Green;"&gt;// your logic here&lt;/span&gt; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;... &lt;br /&gt;}&lt;/div&gt;
 &lt;br /&gt;

 Or from code:
@@ -130,7 +130,7 @@

 Another way is to register global listener:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IBeanMappingListener() { &amp;lt;BR/&amp;gt;   @Override &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; onEvent(BeanMappingEvent event) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Green;"&gt;// your logic here&lt;/span&gt; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IBeanMappingListener() { &lt;br /&gt;   @Override &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; onEvent(BeanMappingEvent event) { &lt;br /&gt;      &lt;span style="color: Green;"&gt;// your logic here&lt;/span&gt; &lt;br /&gt;   } &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;
 It will be called for all beans. From **event** instance you can get bean and type of event.

@@ -138,19 +138,19 @@

 Use annotation **@OnPropertyChange**:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Person { &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String lastName; &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   @OnPropertyChange(destProperty = &lt;span style="color: Maroon;"&gt;"lastName"&lt;/span&gt;,  &amp;lt;BR/&amp;gt;                     calledWhen = {PropertyEventType.AFTER_CHANGE},  &amp;lt;BR/&amp;gt;                     listenChanges = {ChangeType.MODIFY}) &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; onLastNameChange(PropertyChangeEvent event) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Green;"&gt;// some logic&lt;/span&gt; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Person { &lt;br /&gt;... &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String lastName; &lt;br /&gt;... &lt;br /&gt; &lt;br /&gt;   @OnPropertyChange(destProperty = &lt;span style="color: Maroon;"&gt;"lastName"&lt;/span&gt;,  &lt;br /&gt;                     calledWhen = {PropertyEventType.AFTER_CHANGE},  &lt;br /&gt;                     listenChanges = {ChangeType.MODIFY}) &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; onLastNameChange(PropertyChangeEvent event) { &lt;br /&gt;      &lt;span style="color: Green;"&gt;// some logic&lt;/span&gt; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;... &lt;br /&gt;}&lt;/div&gt;

 Read javadoc of @OnPropertyChange for details. It is pretty flexible.
 Or the same from code:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Person.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).method( &amp;lt;BR/&amp;gt;     &lt;span style="color: Maroon;"&gt;"onLastNameChange"&lt;/span&gt;).setPropertyListenerMetadata( &amp;lt;BR/&amp;gt;           &lt;span style="color: Blue;"&gt;new&lt;/span&gt; BeanPropertyListenerMetadata(&lt;span style="color: Maroon;"&gt;"lastName"&lt;/span&gt;,  &amp;lt;BR/&amp;gt;               Arrays.asList(PropertyEventType.AFTER_CHANGE), &amp;lt;BR/&amp;gt;               Arrays.asList(ChangeType.MODIFY)));&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Person.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).method( &lt;br /&gt;     &lt;span style="color: Maroon;"&gt;"onLastNameChange"&lt;/span&gt;).setPropertyListenerMetadata( &lt;br /&gt;           &lt;span style="color: Blue;"&gt;new&lt;/span&gt; BeanPropertyListenerMetadata(&lt;span style="color: Maroon;"&gt;"lastName"&lt;/span&gt;,  &lt;br /&gt;               Arrays.asList(PropertyEventType.AFTER_CHANGE), &lt;br /&gt;               Arrays.asList(ChangeType.MODIFY)));&lt;/div&gt;
 &lt;br /&gt;

 &lt;h4&gt;What if I need to control creation of objects?&lt;/h4&gt;

 You should implement your **IObjectCreator** and register instance of it in **MergingContext**.

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addObjectCreator(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IObjectCreator() { &amp;lt;BR/&amp;gt;   @Override &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getCreatedObjectSuperclass() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; MyObject.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   @Override &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object create(Class targetClass, OperationContextInfo contextInfo) &lt;span style="color: Blue;"&gt;throws&lt;/span&gt; ObjectCreationException { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MyObject(contextInfo.getDestPropertyDescriptor().getName()); &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addObjectCreator(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IObjectCreator() { &lt;br /&gt;   @Override &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getCreatedObjectSuperclass() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; MyObject.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   @Override &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object create(Class targetClass, OperationContextInfo contextInfo) &lt;span style="color: Blue;"&gt;throws&lt;/span&gt; ObjectCreationException { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MyObject(contextInfo.getDestPropertyDescriptor().getName()); &lt;br /&gt;   } &lt;br /&gt;});&lt;/div&gt;

 In this example name of destination property is passed to constructor of MyObject.

@@ -158,7 +158,7 @@

 This can be done by implementing **IBeanFinder** and registering instance of it in **MergingContext**.

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanFinders().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IBeanFinder() { &amp;lt;BR/&amp;gt;   @Override &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getFoundBeanSuperclass() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; MyBean.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   @Override &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object find(Class targetBeanClass, Object identifier) {    &amp;lt;BR/&amp;gt;      &lt;span style="color: Green;"&gt;// logic of finding ...&lt;/span&gt; &amp;lt;BR/&amp;gt;       &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; res; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;}); &amp;lt;BR/&amp;gt;&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanFinders().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IBeanFinder() { &lt;br /&gt;   @Override &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getFoundBeanSuperclass() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; MyBean.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   @Override &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object find(Class targetBeanClass, Object identifier) {    &lt;br /&gt;      &lt;span style="color: Green;"&gt;// logic of finding ...&lt;/span&gt; &lt;br /&gt;       &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; res; &lt;br /&gt;   } &lt;br /&gt;}); &lt;br /&gt;&lt;/div&gt;

 Here are 'find' method take class of bean and identifier of bean (from property marked as **@Identifier**, mentioned above). Using this info it is no problem to find entity it in database.

@@ -166,14 +166,14 @@

 This can be done by annotation **@SkipPropertyChanges** on destination property, or **@SkipPropertyChangesOnDest** on source property. This annotation accept list of change types that should be skipped. 

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@SkipPropertyChanges({ChangeType.DELETE, ChangeType.REPLACE}) &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name1;&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@SkipPropertyChanges({ChangeType.DELETE, ChangeType.REPLACE}) &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name1;&lt;/div&gt;
 &lt;br /&gt;

 Moreover, in same way you can skip container entry changes using annotations **@SkipContainerEntryChanges** (skip for example deletion entries from collection etc) and **@SkipContainerEntryChangesOnDest**.

 If annotations are not appropriate for you then the same can be done from code:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Person.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"name1"&lt;/span&gt;).skipPropertyChanges( &amp;lt;BR/&amp;gt;     ChangeType.DELETE, ChangeType.REPLACE);&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Person.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"name1"&lt;/span&gt;).skipPropertyChanges( &lt;br /&gt;     ChangeType.DELETE, ChangeType.REPLACE);&lt;/div&gt;
 &lt;br /&gt;

 Note, that operations are skipped only one one side of association. Mapping on another side of association will be work as before. This allows to implement one side mapping for selected properties.
@@ -182,16 +182,16 @@

 Yes. You can do it globally by setting:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getRootConfiguration().setPropertyValue( &amp;lt;BR/&amp;gt;    Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE, &lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getRootConfiguration().setPropertyValue( &lt;br /&gt;    Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE, &lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
 &lt;br /&gt;

 Or by creating your own configuration with **Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE** set to **true**, and use this configuration for your bean.

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@ConfigurationUsed(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;) &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyBean { &amp;lt;BR/&amp;gt;... &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@ConfigurationUsed(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;) &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyBean { &lt;br /&gt;... &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/div&gt;

 Then register configuration:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;Configuration c = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Configuration(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;); &amp;lt;BR/&amp;gt;c.setPropertyValue(Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE, &lt;span style="color: Maroon;"&gt;true&lt;/span&gt;); &amp;lt;BR/&amp;gt;context.getRootConfiguration().setSubConfigurations(Arrays.asList(c));&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;Configuration c = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Configuration(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;); &lt;br /&gt;c.setPropertyValue(Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE, &lt;span style="color: Maroon;"&gt;true&lt;/span&gt;); &lt;br /&gt;context.getRootConfiguration().setSubConfigurations(Arrays.asList(c));&lt;/div&gt;
 &lt;br /&gt;

 &lt;h4&gt;Is there way to control by source bean what properties should be mapped and what should be skipped?&lt;/h4&gt;
@@ -202,28 +202,28 @@

 Example of implementation:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Wrapper&amp;lt;T&amp;gt; { &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; T value; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Wrapper(String name, T value) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name = name; &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value = value; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; T getValue() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; value; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setValue(T value) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value = value; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getName() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; name; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setName(String name) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name = name; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; Wrapper&amp;lt;T&amp;gt; { &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String name; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; T value; &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Wrapper(String name, T value) { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name = name; &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value = value; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; T getValue() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; value; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setValue(T value) { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value = value; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getName() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; name; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setName(String name) { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name = name; &lt;br /&gt;   } &lt;br /&gt;}&lt;/div&gt;

 This is generic wrapper. Lets suppose that **name** property should contain contain corresponding name of property.

 Using this wrapper on source:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean { &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; Wrapper&amp;lt;String&amp;gt; field1; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Wrapper&amp;lt;String&amp;gt; getField1() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(Wrapper&amp;lt;String&amp;gt; field1) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean { &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; Wrapper&amp;lt;String&amp;gt; field1; &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Wrapper&amp;lt;String&amp;gt; getField1() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(Wrapper&amp;lt;String&amp;gt; field1) { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1; &lt;br /&gt;   } &lt;br /&gt;}&lt;/div&gt;

 On destination:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyDestBean { &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String field1; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getField1() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(String field1) { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1; &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyDestBean { &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String field1; &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getField1() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1; &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(String field1) { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1; &lt;br /&gt;   } &lt;br /&gt;}&lt;/div&gt;

 Now we should somehow convert from wrapper to wrapped value, and vice versa:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; TypeConverter() { &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) { &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass) &amp;amp;&amp;amp;  &amp;lt;BR/&amp;gt;             !Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) { &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Wrapper&amp;lt;Object&amp;gt;(contextInfo.getDestPropertyDescriptor().getName(), obj); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;}); &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; TypeConverter() { &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) { &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; !Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass) &amp;amp;&amp;amp;  &amp;lt;BR/&amp;gt;               Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) { &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;if&lt;/span&gt; (obj == &lt;span style="color: Blue;"&gt;null&lt;/span&gt;) { &amp;lt;BR/&amp;gt;          &lt;span style="color: Blue;"&gt;return&lt;/span&gt; EQUAL_TO_DESTINATION_MARKER; &amp;lt;BR/&amp;gt;       } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; ((Wrapper)obj).getValue(); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; TypeConverter() { &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) { &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass) &amp;amp;&amp;amp;  &lt;br /&gt;             !Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) { &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Wrapper&amp;lt;Object&amp;gt;(contextInfo.getDestPropertyDescriptor().getName(), obj); &lt;br /&gt;    } &lt;br /&gt;}); &lt;br /&gt; &lt;br /&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; TypeConverter() { &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; canConvert(Class fromClass, Class toClass) { &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; !Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass) &amp;amp;&amp;amp;  &lt;br /&gt;               Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object convert(Class targetClass, Object obj, OperationContextInfo contextInfo) { &lt;br /&gt;       &lt;span style="color: Blue;"&gt;if&lt;/span&gt; (obj == &lt;span style="color: Blue;"&gt;null&lt;/span&gt;) { &lt;br /&gt;          &lt;span style="color: Blue;"&gt;return&lt;/span&gt; EQUAL_TO_DESTINATION_MARKER; &lt;br /&gt;       } &lt;br /&gt; &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; ((Wrapper)obj).getValue(); &lt;br /&gt;    } &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;

 Using this converters wrapper can be used not only for primitive values, but also for any other types (beans, collections, maps). **EQUAL_TO_DESTINATION_MARKER** is returned when wrapper is **null** to mark that destination object should not be changed.

 Also you need to add object creator for mapper:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addObjectCreator(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IObjectCreator() { &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getCreatedObjectSuperclass() { &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object create(Class targetClass, OperationContextInfo contextInfo)  &amp;lt;BR/&amp;gt;           &lt;span style="color: Blue;"&gt;throws&lt;/span&gt; ObjectCreationException { &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Wrapper(contextInfo.getDestPropertyDescriptor().getName(), &lt;span style="color: Blue;"&gt;null&lt;/span&gt;); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addObjectCreator(&lt;span style="color: Blue;"&gt;new&lt;/span&gt; IObjectCreator() { &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Class getCreatedObjectSuperclass() { &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; Object create(Class targetClass, OperationContextInfo contextInfo)  &lt;br /&gt;           &lt;span style="color: Blue;"&gt;throws&lt;/span&gt; ObjectCreationException { &lt;br /&gt; &lt;br /&gt;       &lt;span style="color: Blue;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Wrapper(contextInfo.getDestPropertyDescriptor().getName(), &lt;span style="color: Blue;"&gt;null&lt;/span&gt;); &lt;br /&gt;    } &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;

 In both type converter and object creator **OperationContextInfo** is used to resolve destination property name.&lt;br /&gt;
@@ -234,12 +234,12 @@

 Using specified field on source:

-&lt;div style="font-family: Courier New;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean {  &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String field1;  &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; field1Specified; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getField1() {  &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1;  &amp;lt;BR/&amp;gt;   }  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(String field1) {  &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1;  &amp;lt;BR/&amp;gt;   }  &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; isField1Specified() { &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1Specified;  &amp;lt;BR/&amp;gt;   } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1Specified(String field1Specified) {  &amp;lt;BR/&amp;gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1Specified= field1Specified;  &amp;lt;BR/&amp;gt;   }  &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;&lt;/div&gt;
+&lt;div style="font-family: Courier New;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean {  &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; String field1;  &lt;br /&gt;   &lt;span style="color: Blue;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; field1Specified; &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getField1() {  &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1;  &lt;br /&gt;   }  &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1(String field1) {  &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1 = field1;  &lt;br /&gt;   }  &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;boolean&lt;/span&gt; isField1Specified() { &lt;br /&gt;      &lt;span style="color: Blue;"&gt;return&lt;/span&gt; field1Specified;  &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setField1Specified(String field1Specified) {  &lt;br /&gt;      &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1Specified= field1Specified;  &lt;br /&gt;   }  &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/div&gt;
 &lt;br /&gt;

 Destination object is same as in example with wrapper approach. You can take as convention that all specified field name is **property_name** + "Specified" suffix. Then the only you should do is to tell mapper about this convention:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().all().setSpecifiedFlagPropertyNameResolver( &amp;lt;BR/&amp;gt;              &lt;span style="color: Blue;"&gt;new&lt;/span&gt; ISpecifiedFlagPropertyNameResolver() { &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getSpecifiedFlagPropertyName(PropertyDescriptor targetProperty) { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; targetProperty.getName() + &lt;span style="color: Maroon;"&gt;"Specified"&lt;/span&gt;; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().all().setSpecifiedFlagPropertyNameResolver( &lt;br /&gt;              &lt;span style="color: Blue;"&gt;new&lt;/span&gt; ISpecifiedFlagPropertyNameResolver() { &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; String getSpecifiedFlagPropertyName(PropertyDescriptor targetProperty) { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; targetProperty.getName() + &lt;span style="color: Maroon;"&gt;"Specified"&lt;/span&gt;; &lt;br /&gt;    } &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;

 setting **context.forBeansOfClass(Object.class).forMatchedProperties().all()** means that this will be applied for all types of beans and for all properties. But you can easy set another suffixes for some of your beans if you want - settings are very flexible.
@@ -250,12 +250,12 @@

 Lets suppose we have next class of source bean with collection property, and collection entry bean which contain type of change.

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean { &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;MyCollectionEntryBean&amp;gt; beans; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; List&amp;lt;MyCollectionEntryBean&amp;gt; getBeans() { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; beans; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setBeans(List&amp;lt;MyCollectionEntryBean&amp;gt; beans) { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.beans = beans; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;} &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyCollectionEntryBean { &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Green;"&gt;// some data fields&lt;/span&gt; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;private&lt;/span&gt; ChangeType changeType; &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; getChangeType() { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; changeType; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt; &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; setChangeType(ChangeType changeType) { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.changeType = changeType; &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;}&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MySourceBean { &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;private&lt;/span&gt; List&amp;lt;MyCollectionEntryBean&amp;gt; beans; &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; List&amp;lt;MyCollectionEntryBean&amp;gt; getBeans() { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; beans; &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;void&lt;/span&gt; setBeans(List&amp;lt;MyCollectionEntryBean&amp;gt; beans) { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.beans = beans; &lt;br /&gt;    } &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;"&gt;class&lt;/span&gt; MyCollectionEntryBean { &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Green;"&gt;// some data fields&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;private&lt;/span&gt; ChangeType changeType; &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; getChangeType() { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; changeType; &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; setChangeType(ChangeType changeType) { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;this&lt;/span&gt;.changeType = changeType; &lt;br /&gt;    } &lt;br /&gt;}&lt;/div&gt;
 &lt;br /&gt;

 Then tell mapper to use this **changeType** of MyCollectionEntryBean:

-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(MySourceBean.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"beans"&lt;/span&gt;).markContainerActsAsDiff( &amp;lt;BR/&amp;gt;  &lt;span style="color: Blue;"&gt;new&lt;/span&gt; IContainerEntryChangeTypeAdviser() { &amp;lt;BR/&amp;gt;    @Override &amp;lt;BR/&amp;gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; ChangeType adviceChangeType(Object srcContainerEntry) { &amp;lt;BR/&amp;gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; ((MyCollectionEntryBean) srcContainerEntry).getChangeType(); &amp;lt;BR/&amp;gt;    } &amp;lt;BR/&amp;gt;});&lt;/div&gt;
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(MySourceBean.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"beans"&lt;/span&gt;).markContainerActsAsDiff( &lt;br /&gt;  &lt;span style="color: Blue;"&gt;new&lt;/span&gt; IContainerEntryChangeTypeAdviser() { &lt;br /&gt;    @Override &lt;br /&gt;    &lt;span style="color: Blue;"&gt;public&lt;/span&gt; ChangeType adviceChangeType(Object srcContainerEntry) { &lt;br /&gt;        &lt;span style="color: Blue;"&gt;return&lt;/span&gt; ((MyCollectionEntryBean) srcContainerEntry).getChangeType(); &lt;br /&gt;    } &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;

 Now if for example **changeType** will be **ChangeType.DELETE** then corresponding destination elements will be deleted etc.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Mon, 17 Nov 2014 20:07:23 -0000</pubDate><guid>https://sourceforge.netf18a783e3ccc4d0128d8c30d2e9badf99a2b55d4</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v45
+++ v46
@@ -243,3 +243,19 @@
 &lt;br /&gt;

 setting **context.forBeansOfClass(Object.class).forMatchedProperties().all()** means that this will be applied for all types of beans and for all properties. But you can easy set another suffixes for some of your beans if you want - settings are very flexible.
+
+&lt;h4&gt;Is there way to control on source collection what changes should be performed with elements of destination collection? For example can I hold on source collections beans which should be removed?&lt;/h4&gt;
+
+Yes, this question is a little bit similar to previous. You can need this when source collection acts as diff of changes, rather then prototype of of what destination collection should be.
+
+Lets suppose we have next class of source bean with collection property, and collection entry bean which contain type of change.
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MySourceBean&amp;nbsp;{ &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;List&amp;lt;MyCollectionEntryBean&amp;gt;&amp;nbsp;beans; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;List&amp;lt;MyCollectionEntryBean&amp;gt;&amp;nbsp;getBeans()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;beans; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setBeans(List&amp;lt;MyCollectionEntryBean&amp;gt;&amp;nbsp;beans)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.beans&amp;nbsp;=&amp;nbsp;beans; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MyCollectionEntryBean&amp;nbsp;{ &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;some&amp;nbsp;data&amp;nbsp;fields&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;ChangeType&amp;nbsp;changeType; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;getChangeType()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;changeType; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;setChangeType(ChangeType&amp;nbsp;changeType)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.changeType&amp;nbsp;=&amp;nbsp;changeType; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/div&gt;
+&lt;br /&gt;
+
+Then tell mapper to use this **changeType** of MyCollectionEntryBean:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(MySourceBean.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"beans"&lt;/span&gt;).markContainerActsAsDiff( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IContainerEntryChangeTypeAdviser()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;ChangeType&amp;nbsp;adviceChangeType(Object&amp;nbsp;srcContainerEntry)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;((MyCollectionEntryBean)&amp;nbsp;srcContainerEntry).getChangeType(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+
+Now if for example **changeType** will be **ChangeType.DELETE** then corresponding destination elements will be deleted etc.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 02 Jan 2014 14:31:27 -0000</pubDate><guid>https://sourceforge.netd02cf64fd1ee968fc519db79ce12493e90dc0bfe</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v44
+++ v45
@@ -228,6 +228,18 @@

 In both type converter and object creator **OperationContextInfo** is used to resolve destination property name.&lt;br /&gt;

-That's all you should do to implement wrappers.
-
-**2) Every property on destination have corresponding boolean property, which define whether first property should be mapped or not**.
+That's all you should do to implement wrappers. And the second approach to control mapping on source bean is:
+
+**2) Every property on source bean have corresponding boolean property, which define whether first property should be mapped or not**. Lets name this boolean field as **specified field**.
+
+Using specified field on source:
+
+&lt;div style="font-family: Courier New;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MySourceBean&amp;nbsp;{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;String&amp;nbsp;field1;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;field1Specified; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getField1()&amp;nbsp;{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;field1;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setField1(String&amp;nbsp;field1)&amp;nbsp;{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1&amp;nbsp;=&amp;nbsp;field1;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;isField1Specified()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;field1Specified;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setField1Specified(String&amp;nbsp;field1Specified)&amp;nbsp;{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1Specified=&amp;nbsp;field1Specified;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/div&gt;
+&lt;br /&gt;
+
+Destination object is same as in example with wrapper approach. You can take as convention that all specified field name is **property_name** + "Specified" suffix. Then the only you should do is to tell mapper about this convention:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().all().setSpecifiedFlagPropertyNameResolver( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;ISpecifiedFlagPropertyNameResolver()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getSpecifiedFlagPropertyName(PropertyDescriptor&amp;nbsp;targetProperty)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;targetProperty.getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: Maroon;"&gt;"Specified"&lt;/span&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+
+setting **context.forBeansOfClass(Object.class).forMatchedProperties().all()** means that this will be applied for all types of beans and for all properties. But you can easy set another suffixes for some of your beans if you want - settings are very flexible.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 02 Jan 2014 14:15:23 -0000</pubDate><guid>https://sourceforge.netb1ae6a8bc5d19f00d90b18ed55a21a35d994247c</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v43
+++ v44
@@ -198,7 +198,7 @@

 You can need this when source acts as diff of changes, rather then prototype of of what destination should be. There is several ways to achieve this.

-1) Every property on destination is wrapped by generic wrapper (for example JAXBElement, when you use web services). When wrapper is **null** then corresponding property should not be wrapped. When it is not **null**, then wrapped value should be mapped.
+**1) Every property on source is wrapped by generic wrapper** (for example JAXBElement, when you use web services). When wrapper is **null** then corresponding property should not be wrapped. When it is not **null**, then wrapped value should be mapped.

 Example of implementation:

@@ -206,7 +206,7 @@

 This is generic wrapper. Lets suppose that **name** property should contain contain corresponding name of property.

-User this wrapper on source:
+Using this wrapper on source:

 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MySourceBean&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;String&amp;gt;&amp;nbsp;field1; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;String&amp;gt;&amp;nbsp;getField1()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setField1(Wrapper&amp;lt;String&amp;gt;&amp;nbsp;field1)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1&amp;nbsp;=&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/div&gt;

@@ -217,3 +217,17 @@
 Now we should somehow convert from wrapper to wrapped value, and vice versa:

 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;TypeConverter()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;canConvert(Class&amp;nbsp;fromClass,&amp;nbsp;Class&amp;nbsp;toClass)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;convert(Class&amp;nbsp;targetClass,&amp;nbsp;Object&amp;nbsp;obj,&amp;nbsp;OperationContextInfo&amp;nbsp;contextInfo)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;Object&amp;gt;(contextInfo.getDestPropertyDescriptor().getName(),&amp;nbsp;obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}); &lt;br /&gt; &lt;br /&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;TypeConverter()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;canConvert(Class&amp;nbsp;fromClass,&amp;nbsp;Class&amp;nbsp;toClass)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;!Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;convert(Class&amp;nbsp;targetClass,&amp;nbsp;Object&amp;nbsp;obj,&amp;nbsp;OperationContextInfo&amp;nbsp;contextInfo)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;if&lt;/span&gt;&amp;nbsp;(obj&amp;nbsp;==&amp;nbsp;&lt;span style="color: Blue;"&gt;null&lt;/span&gt;)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;EQUAL_TO_DESTINATION_MARKER; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;((Wrapper)obj).getValue(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+
+Using this converters wrapper can be used not only for primitive values, but also for any other types (beans, collections, maps). **EQUAL_TO_DESTINATION_MARKER** is returned when wrapper is **null** to mark that destination object should not be changed.
+
+Also you need to add object creator for mapper:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addObjectCreator(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IObjectCreator()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Class&amp;nbsp;getCreatedObjectSuperclass()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;create(Class&amp;nbsp;targetClass,&amp;nbsp;OperationContextInfo&amp;nbsp;contextInfo)&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;throws&lt;/span&gt;&amp;nbsp;ObjectCreationException&amp;nbsp;{ &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;Wrapper(contextInfo.getDestPropertyDescriptor().getName(),&amp;nbsp;&lt;span style="color: Blue;"&gt;null&lt;/span&gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+
+In both type converter and object creator **OperationContextInfo** is used to resolve destination property name.&lt;br /&gt;
+
+That's all you should do to implement wrappers.
+
+**2) Every property on destination have corresponding boolean property, which define whether first property should be mapped or not**.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 02 Jan 2014 14:02:33 -0000</pubDate><guid>https://sourceforge.net5b4aca8b41508f93bc956728b93bc7569f8e3c68</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v42
+++ v43
@@ -192,4 +192,28 @@
 Then register configuration:

 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;Configuration&amp;nbsp;c&amp;nbsp;=&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;Configuration(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;); &lt;br /&gt;c.setPropertyValue(Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE,&amp;nbsp;&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;); &lt;br /&gt;context.getRootConfiguration().setSubConfigurations(Arrays.asList(c));&lt;/div&gt;
-
+&lt;br /&gt;
+
+&lt;h4&gt;Is there way to control by source bean what properties should be mapped and what should be skipped?&lt;/h4&gt;
+
+You can need this when source acts as diff of changes, rather then prototype of of what destination should be. There is several ways to achieve this.
+
+1) Every property on destination is wrapped by generic wrapper (for example JAXBElement, when you use web services). When wrapper is **null** then corresponding property should not be wrapped. When it is not **null**, then wrapped value should be mapped.
+
+Example of implementation:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;T&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;String&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;T&amp;nbsp;value; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Wrapper(String&amp;nbsp;name,&amp;nbsp;T&amp;nbsp;value)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name&amp;nbsp;=&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value&amp;nbsp;=&amp;nbsp;value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;T&amp;nbsp;getValue()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setValue(T&amp;nbsp;value)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.value&amp;nbsp;=&amp;nbsp;value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getName()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setName(String&amp;nbsp;name)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.name&amp;nbsp;=&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/div&gt;
+
+This is generic wrapper. Lets suppose that **name** property should contain contain corresponding name of property.
+
+User this wrapper on source:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MySourceBean&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;String&amp;gt;&amp;nbsp;field1; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;String&amp;gt;&amp;nbsp;getField1()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setField1(Wrapper&amp;lt;String&amp;gt;&amp;nbsp;field1)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1&amp;nbsp;=&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/div&gt;
+
+On destination:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MyDestBean&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;String&amp;nbsp;field1; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getField1()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;setField1(String&amp;nbsp;field1)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;.field1&amp;nbsp;=&amp;nbsp;field1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/div&gt;
+
+Now we should somehow convert from wrapper to wrapped value, and vice versa:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;TypeConverter()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;canConvert(Class&amp;nbsp;fromClass,&amp;nbsp;Class&amp;nbsp;toClass)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;convert(Class&amp;nbsp;targetClass,&amp;nbsp;Object&amp;nbsp;obj,&amp;nbsp;OperationContextInfo&amp;nbsp;contextInfo)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;Wrapper&amp;lt;Object&amp;gt;(contextInfo.getDestPropertyDescriptor().getName(),&amp;nbsp;obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}); &lt;br /&gt; &lt;br /&gt;context.addTypeConverter(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;TypeConverter()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;boolean&lt;/span&gt;&amp;nbsp;canConvert(Class&amp;nbsp;fromClass,&amp;nbsp;Class&amp;nbsp;toClass)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;!Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(toClass)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wrapper.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;.isAssignableFrom(fromClass); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;convert(Class&amp;nbsp;targetClass,&amp;nbsp;Object&amp;nbsp;obj,&amp;nbsp;OperationContextInfo&amp;nbsp;contextInfo)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;if&lt;/span&gt;&amp;nbsp;(obj&amp;nbsp;==&amp;nbsp;&lt;span style="color: Blue;"&gt;null&lt;/span&gt;)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;EQUAL_TO_DESTINATION_MARKER; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&amp;nbsp;((Wrapper)obj).getValue(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 02 Jan 2014 13:50:40 -0000</pubDate><guid>https://sourceforge.net3eedb2abeb797558aa1b0e607a3eba1308e80020</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v41
+++ v42
@@ -1,4 +1,4 @@
-This documentation is actual for java-object-merger-0.8.4.
+This documentation is actual for java-object-merger-0.8.5.1.

 &lt;h4&gt;How to start work with library?&lt;/h4&gt;
 You should create merging context at first.
@@ -169,7 +169,7 @@
 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@SkipPropertyChanges({ChangeType.DELETE,&amp;nbsp;ChangeType.REPLACE}) &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;String&amp;nbsp;name1;&lt;/div&gt;
 &lt;br /&gt;

-Moreover, in same way you can skip container entry changes using annotation **@SkipContainerEntryChanges** (skip for example deletion entries from collection etc)
+Moreover, in same way you can skip container entry changes using annotations **@SkipContainerEntryChanges** (skip for example deletion entries from collection etc) and **@SkipContainerEntryChangesOnDest**.

 If annotations are not appropriate for you then the same can be done from code:

@@ -186,3 +186,10 @@
 &lt;br /&gt;

 Or by creating your own configuration with **Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE** set to **true**, and use this configuration for your bean.
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@ConfigurationUsed(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;) &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;MyBean&amp;nbsp;{ &lt;br /&gt;... &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/div&gt;
+
+Then register configuration:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;Configuration&amp;nbsp;c&amp;nbsp;=&amp;nbsp;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;Configuration(&lt;span style="color: Maroon;"&gt;"myConfig"&lt;/span&gt;); &lt;br /&gt;c.setPropertyValue(Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE,&amp;nbsp;&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;); &lt;br /&gt;context.getRootConfiguration().setSubConfigurations(Arrays.asList(c));&lt;/div&gt;
+
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 02 Jan 2014 13:23:05 -0000</pubDate><guid>https://sourceforge.net7f577318414f18fb6efaba4f4af65aa7e20b5ed4</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v40
+++ v41
@@ -115,7 +115,7 @@

 We create local merging context because don't want to harm original mapping for BookDTO.class. But in local merging context we can do anything, and we mark that for books we want to: **mapOnly("identifier")**.

-&lt;h4&gt;What if I need some post processing of bean, after finishing of mapping?&lt;/h4&gt;
+&lt;h4&gt;What if I need some postprocessing of bean, after finishing of mapping?&lt;/h4&gt;
 Use annotation **@OnBeanMappingFinished** to mark method of bean which will be called after finishing mapping of bean:

 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&amp;nbsp;Person&amp;nbsp;{ &lt;br /&gt;... &lt;br /&gt; &lt;br /&gt;@OnBeanMappingFinished &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;onAfterMapping()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;... &lt;br /&gt;}&lt;/div&gt;
@@ -127,6 +127,12 @@
 &lt;br /&gt;

 Also you can subscribe on before map starting event using **@OnBeanMappingStartring** annotation.
+
+Another way is to register global listener:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IBeanMappingListener()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onEvent(BeanMappingEvent&amp;nbsp;event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+It will be called for all beans. From **event** instance you can get bean and type of event.

 &lt;h4&gt;What if I need to provide some postprocessing logic after finishing mapping of property of the bean?&lt;/h4&gt;

@@ -172,19 +178,6 @@

 Note, that operations are skipped only one one side of association. Mapping on another side of association will be work as before. This allows to implement one side mapping for selected properties.

-&lt;h4&gt;What if I need some postprocessing of bean, after finishing of mapping all of its properties?&lt;/h4&gt;
-
-This can be achieved in two ways. First, using annotation **@OnBeanMappingFinished** which you should specify on method of bean without arguments.
-
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@OnBeanMappingFinished &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onAfterMap()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;}&lt;/div&gt;
-&lt;br /&gt;
-This method will be called after mapping of all bean properties. Also take a look on annotation **@OnBeanMappingStarted** it marks method, which will be called **before** all mapping in bean.
-The second way is to register global listener:
-
-&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IBeanMappingListener()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onEvent(BeanMappingEvent&amp;nbsp;event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
-&lt;br /&gt;
-It will be called for all beans. From **event** instance you can get bean and type of event.
-
 &lt;h4&gt;Hibernate throws error when PersistentBag is set to null, can I somehow clean collection on entity instead of setting it to null?&lt;/h4&gt;

 Yes. You can do it globally by setting:
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 26 Dec 2013 12:42:37 -0000</pubDate><guid>https://sourceforge.netd4b64f3cacff4eed77da48c6d9784b573f0ff411</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v39
+++ v40
@@ -89,6 +89,24 @@

 Use annotation **@Identifier** to mark property which is considered to be indentifier of entity. And mapper will compare beans with equal identifiers. If identifier is not specified then beans will be compared by equals method of it.

+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@Identifier &lt;br /&gt;&lt;span style="color: Blue;"&gt;private&lt;/span&gt;&amp;nbsp;Integer&amp;nbsp;identifier;&lt;/div&gt;
+&lt;br /&gt;
+
+Or you can specify from code, that for all beans all properties which name is "identifier" are identifiers!
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).forMatchedProperties().ofNames( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;).setIdentifier(&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
+&lt;br /&gt;
+
+This code apply metadata for all beans which extends from Object.class and for all properties with name "identifier". **forMatchedProperties()** is very powerful mechanism. It allows to set metadata on properties which are lazy matched to specified criteria. It can greatly reduce amount of metadata code.
+Note that next code will throw error
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(Object.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;).setIdentifier(&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;WRONG!&lt;/span&gt;&lt;/div&gt;
+&lt;br /&gt;
+.. because it will try to find property "identifier" in Object. But if you have some basic type for all entities (for exapmle PersistentEntity) with "identifier" property, then next code will work:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.forBeansOfClass(PersistentEntity.&lt;span style="color: Blue;"&gt;class&lt;/span&gt;).property(&lt;span style="color: Maroon;"&gt;"identifier"&lt;/span&gt;).setIdentifier(&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
+&lt;br /&gt;
+
 &lt;h4&gt;What if during mapping of collection I need to update just links to some entities (not content)?&lt;/h4&gt;
 You can do it from code with creation of local merging context:

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 26 Dec 2013 12:35:55 -0000</pubDate><guid>https://sourceforge.net5115715cab8a6da71a88384cb7af37419d38ea69</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v38
+++ v39
@@ -166,3 +166,12 @@
 &lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IBeanMappingListener()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onEvent(BeanMappingEvent&amp;nbsp;event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
 &lt;br /&gt;
 It will be called for all beans. From **event** instance you can get bean and type of event.
+
+&lt;h4&gt;Hibernate throws error when PersistentBag is set to null, can I somehow clean collection on entity instead of setting it to null?&lt;/h4&gt;
+
+Yes. You can do it globally by setting:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getRootConfiguration().setPropertyValue( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE,&amp;nbsp;&lt;span style="color: Maroon;"&gt;true&lt;/span&gt;);&lt;/div&gt;
+&lt;br /&gt;
+
+Or by creating your own configuration with **Configuration.CLEAN_COLLECTION_INSTEAD_REMOVE** set to **true**, and use this configuration for your bean.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 26 Dec 2013 11:51:38 -0000</pubDate><guid>https://sourceforge.net90e6d0b5d8b540e70ba6e04ce919315776f39ee0</guid></item><item><title>Technical FAQ with examples modified by Evgeniy Voronyuk</title><link>https://sourceforge.net/p/javaobjectmerger/wiki/Technical%2520FAQ%2520with%2520examples/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v37
+++ v38
@@ -154,4 +154,15 @@

 Note, that operations are skipped only one one side of association. Mapping on another side of association will be work as before. This allows to implement one side mapping for selected properties.

+&lt;h4&gt;What if I need some postprocessing of bean, after finishing of mapping all of its properties?&lt;/h4&gt;

+This can be achieved in two ways. First, using annotation **@OnBeanMappingFinished** which you should specify on method of bean without arguments.
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;@OnBeanMappingFinished &lt;br /&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onAfterMap()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;}&lt;/div&gt;
+&lt;br /&gt;
+This method will be called after mapping of all bean properties. Also take a look on annotation **@OnBeanMappingStarted** it marks method, which will be called **before** all mapping in bean.
+The second way is to register global listener:
+
+&lt;div style="font-family: Courier New; margin-left: 30px;"&gt;context.getBeanMappingListeners().add(&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&amp;nbsp;IBeanMappingListener()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&amp;nbsp;onEvent(BeanMappingEvent&amp;nbsp;event)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green;"&gt;//&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;});&lt;/div&gt;
+&lt;br /&gt;
+It will be called for all beans. From **event** instance you can get bean and type of event.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Evgeniy Voronyuk</dc:creator><pubDate>Thu, 26 Dec 2013 11:40:48 -0000</pubDate><guid>https://sourceforge.net5ad5a8c45c1ae13b7ccbd1979f834eeb7563cf7b</guid></item></channel></rss>