在create entity事件上创建一些子文件

时间:2016-08-02 12:59:55

标签: cuba-platform

我的实体名为Productsnamedescription),然后是名为ProductPrices的实体(ProductRate,{{ 1}})和实体费率。

我需要在创建产品时获得所有费率,并在Price中创建条目以进行编辑ProductPrices,并在同一屏幕上编辑prices(同一网格)不使用prices的编辑器屏幕。

在同一个问题上,当我添加新的ProductPrices时,我需要在所有可用产品中创建所有记录。

如何在我的测试项目中执行此步骤?

3 个答案:

答案 0 :(得分:1)

在数据模型中,我将ProductPriceProduct的集合标记为@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

答案 1 :(得分:0)

我附上了我的屏幕截图。对我来说没关系。问题是当我创建一个新产品时,我们需要在其价格中插入所有可用的费率。

Screen Created

Entity Product

当我创建新的RAte时,我需要在ProductPrices中为所有现有产品添加值0.

当我创建新产品时,我需要在ProductPrices中添加一个值为0的所有可用费率。

答案 2 :(得分:0)