0

我有名为Products( name, description) 的实体,然后是名为ProductPrices( Product, Rate, Price) 的实体和实体 Rates。

我需要在创建产品时获取所有可用费率,并在中创建条目以ProductPrices进行编辑prices,并prices在不使用ProductPrices.

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

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

4

3 回答 3

1

在数据模型中,我将ProductPricein的集合标记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);
        }
    }
}

工作示例项目可在此处获得。

于 2016-08-06T08:57:25.930 回答
0

我附上了我的屏幕截图。对我来说还可以。问题是当我创建一个新产品时,我们需要在他们的价格中插入表价格中的所有可用价格。

屏幕创建

实体产品

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

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

于 2016-08-03T14:19:47.783 回答
0

其他捕获

实体产品价格

实体费率

于 2016-08-03T14:33:55.173 回答