我的实体名为Products
(name
,description
),然后是名为ProductPrices
的实体(Product
,Rate
,{{ 1}})和实体费率。
我需要在创建产品时获得所有费率,并在Price
中创建条目以进行编辑ProductPrices
,并在同一屏幕上编辑prices
(同一网格)不使用prices
的编辑器屏幕。
在同一个问题上,当我添加新的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。
答案 1 :(得分:0)
我附上了我的屏幕截图。对我来说没关系。问题是当我创建一个新产品时,我们需要在其价格中插入所有可用的费率。
当我创建新的RAte时,我需要在ProductPrices中为所有现有产品添加值0.
当我创建新产品时,我需要在ProductPrices中添加一个值为0的所有可用费率。
答案 2 :(得分:0)