2017-08-03 8 views
0

私はMapStructを初めて使用しており、googleで私の質問に対する回答を見つけることができませんでした。 サンプル(他のプロパティの中でも)を持っているShoppingCartを持っていて、各サンプルにはShoppingCartへの参照が必要です。 MapStructでこのようなマッピングを行うことは可能ですか? MapStructを使用しないShoppingCartへの参照をサンプルに渡すだけです。これは、手で書かれました:MapStructバックリンクマッピングは可能ですか?

protected ShoppingCart map(Cart cart, DataShareOption dataShareOption) { 
//(other stuff) 
    for (CartSample cartSample : cart.getCartSamples()) { 
     ShoppingCartSample sample = mapCartSample(cartSample, shoppingCart, 
     dataShareOption); 
     shoppingCart.getSamples().add(sample); 
    } 
} 

protected ShoppingCartSample mapCartSample(CartSample cartSample, 
    ShoppingCart shoppingCart, DataShareOption dataShareOption) { 

    ShoppingCartSample sample = new ShoppingCartSample(); 
    sample.setShoppingCart(shoppingCart); 
    //(other stuff) 
    return sample; 
} 

// the classes declarations: 
// business class 
public class ShoppingCart extends ShoppingCartHeader 
{ 
    private List<ShoppingCartSample> samples = new ArrayList<ShoppingCartSample>(); 
//rest of the class 


// data base class: 
@Entity 
@Table(name = "cart") 
public class Cart extends BaseEntity 
{ 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "cart") 
private Set<CartSample> cartSamples = new HashSet<CartSample>(); 
    // more stuff here 


// business class: 
    public class ShoppingCartSample 
    { 
    private ShoppingCart shoppingCart; 
    // rest of the class 


// data base class: 
@Entity 
@Table(name = "cart_sample") 
public class CartSample 
{ 
    @ManyToOne() 
    @JoinColumn(name = "cart_id") 
    private Cart cart; 
    // more stuff here 
+0

は、あなたやMapStructによって作成された問題の方法ですか? – Filip

+0

'ShoppingCart'には' ShoppingCartSample'(s)が含まれていますか?マップしたいサイクルがありますか?モデルの簡略化されたコードを表示できますか?私はこの情報を必要とするので、質問に最も正確に答えることができます。私は現時点で正しく理解しているかどうかはわかりません。 – Filip

+0

はい、ShoppingCartにShoppingCarSamplesが含まれています。 ShoppingCartSampleにはShoppingCartが含まれています。私はこれをサイクルと呼ぶことができると思います。 –

答えて

0

あなたのマッパー

@Mapper 
@DecoratedWith(MyMapperDecorator.class) 
public interface MyMapper { 
    ShoppingCart map(Cart cart); 
    ShoppingCartSample map(CartSample cart); 
} 

あなたのデコレータ

public abstract class MyMapperDecorator implements MyMapper { 
    private final MyMapper delegate; 

    public ParticulierMapperDecorator(MyMapper delegate) { 
     this.delegate = delegate; 
    } 

    public ShoppingCart map(Cart cart){ 
     ShoppingCart shoppingCart = delegate.map(cart);//map the two objects 
     //Set your link 
     for(ShoppingCartSample sample: hoppingCart.getSampes()){ 
      sample.setShoppingCart(shoppingCart) 
     } 
    } 
} 
mapstructによって自動的に

を呼び出し、toherクラスを自分でdecoratorを使用してリンクを設定することができます

+0

をマッピングします。マッピング中にサイクルが作成されます。私は今日、後で、マッピングサイクルに使用すべき回答を投稿します – Filip

0

mapstruct-mapping-with-cyclesリポジトリをご利用ください新しい(1.2.0から)@Contextのサイクルをマップします(これはあなたのものです)。

ここにもコード:

public class CycleAvoidingMappingContext { 
    private Map<Object, Object> knownInstances = new IdentityHashMap<Object, Object>(); 
    @BeforeMapping 
    public <T> T getMappedInstance(Object source, @TargetType Class<T> targetType) { 
     return (T) knownInstances.get(source); 
    } 
    @BeforeMapping 
    public void storeMappedInstance(Object source, @MappingTarget Object target) { 
     knownInstances.put(source, target); 
    } 
} 

CycleAvoidingMappingContextsourcetargetオブジェクトは、より具体的な種類のことができることを覚えておいて、彼らがObjectである必要はありません。

マッパーは、次のようになります。

@Mapper 
public interface MyMapper { 
    ShoppingCart map(Cart cart, @Context CycleAvoidingMappingContext context); 
    ShoppingCartSample map(CartSample cart, @Context CycleAvoidingMappingContext context); 
} 
関連する問題