2016-08-02 105 views
0

我有一個名爲Productsnamedescription)實體,然後實體命名ProductPricesProductRatePrice),和實體價格的一些子文件。創建上創建的實體事件

我需要讓所有的價格,當我創建一個產品,並在ProductPrices創建的條目編輯prices,和編輯prices同一屏幕上(同一電網)不使用的ProductPrices編輯屏幕。

在同一個問題上,當我添加一個新的Rate時,我需要在所有可用產品中創建所有記錄。

如何在我的測試項目中執行此步驟?

+0

您可以附上所需屏幕布局的草圖嗎? – knstvk

+0

你能看到任何嗎? –

回答

0

我附上了我的屏幕截圖。對我來說確定。問題是當我創建一個新的producto時,我們需要在他們的價格中插入表中所有可用的價格。

Screen Created

Entity Product

當我創建一個新的利率,我需要在ProductPrices添加值0所有現有產品。

當我創建一個新產品時,我需要在ProductPrices中爲所有可用費率添加值0。

1

在數據模型中,我已經標誌着ProductPrice集合中Product@Composition。這意味着產品價格將僅作爲產品的一部分進行編輯。

public class Product extends StandardEntity { 

    @Column(name = "NAME") 
    protected String name; 

    @Column(name = "DESCRIPTION") 
    protected String description; 

    @OrderBy("orderNo") 
    @Composition 
    @OnDelete(DeletePolicy.CASCADE) 
    @OneToMany(mappedBy = "product") 
    protected List<ProductPrice> prices; 

ProductPrice實體具有對錶中的正確排序的不可見屬性orderNo

對於自動添加產品的價格創建新的產品時,我實現了在產品編輯器中initNewItem()方法:

public class ProductEdit extends AbstractEditor<Product> { 

    @Inject 
    private Metadata metadata; 
    @Inject 
    private DataManager dataManager; 

    @Override 
    protected void initNewItem(Product item) { 
     item.setPrices(new ArrayList<>()); 

     List<Rate> rates = dataManager.loadList(
       LoadContext.create(Rate.class).setQuery(
         LoadContext.createQuery("select r from products$Rate r order by r.name"))); 

     int i = 0; 
     for (Rate rate : rates) { 
      ProductPrice productPrice = metadata.create(ProductPrice.class); 
      productPrice.setProduct(item); 
      productPrice.setRate(rate); 
      productPrice.setPrice(BigDecimal.ZERO); 
      productPrice.setOrderNo(i++); 
      item.getPrices().add(productPrice); 
     } 
    } 
} 

爲了在線編輯的價格,我給自己定了editable="true"表及其price列:

<table id="pricesTable" 
     editable="true" 
     height="200px" 
     width="100%"> 
    <columns> 
     <column id="rate"/> 
     <column id="price" 
       editable="true"/> 
    </columns> 

您的當一個新的Rate添加可以通過實體監聽器來實現所有產品建立相應的產品價格的要求:

@Component("products_RateEntityListener") 
public class RateEntityListener implements BeforeInsertEntityListener<Rate> { 

    @Inject 
    private Persistence persistence; 
    @Inject 
    private Metadata metadata; 

    @Override 
    public void onBeforeInsert(Rate entity) { 
     TypedQuery<Product> query = persistence.getEntityManager().createQuery("select p from products$Product p", Product.class); 
     List<Product> products = query.getResultList(); 
     for (Product product : products) { 
      ProductPrice productPrice = metadata.create(ProductPrice.class); 
      productPrice.setProduct(product); 
      productPrice.setRate(entity); 
      productPrice.setPrice(BigDecimal.ZERO); 

      Integer maxOrder = product.getPrices().stream() 
        .map(ProductPrice::getOrderNo) 
        .max(Integer::compareTo) 
        .orElse(0); 
      productPrice.setOrderNo(maxOrder + 1); 

      persistence.getEntityManager().persist(productPrice); 
     } 
    } 
} 

工作示例項目可用here