在数据模型中,我将ProductPrice
in的集合标记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);
}
}
}
工作示例项目可在此处获得。