在數據模型中,我已經標誌着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。
您可以附上所需屏幕布局的草圖嗎? – knstvk
你能看到任何嗎? –