2017-08-03 115 views
0

我是MapStruct的新手,無法在Google上找到我的問題的答案。 我有一個購物車已獲得樣品(其他屬性),每個樣品需要一個參考返回到我的ShoppingCart。是否可以使用MapStruct進行這種映射? 如果沒有MapStruct,我只需將對ShoppingCart的引用傳遞給Samples。這是手寫的: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

可以使用decorator並設置自己與toher類的鏈接,通過mapstruct自動調用

您的映射

@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) 
     } 
    } 
} 
+0

這將在映射期間創建一個循環。我今天晚些時候會發佈一個應該用於映射週期的答案 – Filip

0

看看它使用的mapstruct-mapping-with-cycles存儲庫e新(從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); 
}