【发布时间】:2019-12-03 12:16:17
【问题描述】:
我刚刚开始使用 JPA。我有一个实体CustomerOrderEntity,它与另一个实体BeverageEntity 有@OneToMany 关系。当我将BeverageEntity 添加到CustomerOrderEntity 时,会创建一个BeverageEntity 类型的新实体,并作为新记录保存在数据库中。我不想要这样的东西,我只需要 CustomerOrderEntity 拥有 BeverageEntity 的记录,并且不会在数据库中为此创建新实体。
这两个实体是从这个类SalesManagement调用的:
@Stateless
@Remote(SalesManagement.class)
public class SalesManagementBean implements SalesManagement {
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
EntityManager em;
@Override
public void createOrder(CustomerOrder order) {
order.getOrderItems().forEach(item -> {
updateBeverageQuantity(item.getId(), item.getQuantity());
});
CustomerOrderEntity customerOrderEntity = new CustomerOrderEntity();
customerOrderEntity.setIssueDate(order.getIssueDate());
order.getOrderItems().forEach(item ->{
customerOrderEntity.addOrder(toEntity(item));
});
em.persist(customerOrderEntity);
}
public void updateBeverageQuantity(int b_id, int quantity) {
BeverageEntity beverageEntity = em.find(BeverageEntity.class, b_id);
if(beverageEntity != null) {
beverageEntity.setQuantity(beverageEntity.getQuantity() - quantity);
em.persist(beverageEntity);
}
}
public List<BeverageEntity> toBeverageEntity(List<Beverage> beverages) {
List<BeverageEntity> entities = new ArrayList<BeverageEntity>();
if(beverages != null && beverages.size() > 0) {
beverages.forEach(beverage -> {
BeverageEntity entity = new BeverageEntity();
entity.setName(beverage.getName());
entity.setManufacturer(beverage.getManufacturer());
entity.setQuantity(beverage.getQuantity());
entity.setPrice(beverage.getPrice());
entity.setIncentiveEntity(toIncentiveEntity(beverage.getIncentiveDTO()));
entities.add(entity);
});
return entities;
}
return null;
}
public IncentiveEntity toIncentiveEntity(IncentiveDTO incentiveDTO) {
if(incentiveDTO != null) {
IncentiveEntity entity = null;
return entity;
}
return null;
}
public BeverageEntity toEntity(Beverage b) {
BeverageEntity entity = new BeverageEntity();
entity.setName(b.getName());
entity.setManufacturer(b.getManufacturer());
entity.setQuantity(b.getQuantity());
entity.setPrice(b.getPrice());
entity.setIncentiveEntity(toIncentiveEntity(b.getIncentiveDTO()));
return entity;
}
}
我认为问题在于方法toBeverageEntity。但我不确定。
CustomerOrderEntity:
@Entity
public class CustomerOrderEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
@Version
private int version;
private Date issueDate;
@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
private List<BeverageEntity> beverageEntities;
public void addOrder(BeverageEntity beverageEntity) {
this.beverageEntities.add(beverageEntity);
}
public List<BeverageEntity> getBeverageEntities() {
return beverageEntities;
}
public void setBeverageEntities(List<BeverageEntity> beverageEntities) {
this.beverageEntities = beverageEntities;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public Date getIssueDate() {
return issueDate;
}
public void setIssueDate(Date issueDate) {
this.issueDate = issueDate;
}
}
BeverageEntity:
@Entity
public class BeverageEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
private String name;
private String manufacturer;
private int quantity;
private double price;
@Version
private int version;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
private IncentiveEntity incentiveEntity;
public BeverageEntity() {
}
public BeverageEntity(String name, String manufacturer, int quantity, Double price, IncentiveEntity entity) {
this.name = name;
this.manufacturer = manufacturer;
this.quantity = quantity;
this.price = price;
this.incentiveEntity = entity;
}
public BeverageEntity(String name, String manufacturer, int quantity, Double price) {
this.name = name;
this.manufacturer = manufacturer;
this.quantity = quantity;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public IncentiveEntity getIncentiveEntity() {
return incentiveEntity;
}
public void setIncentiveEntity(IncentiveEntity incentiveEntity) {
this.incentiveEntity = incentiveEntity;
}
}
【问题讨论】:
-
如果您不能评论/建议某事,为什么要投反对票。
-
你必须实现beverageEntities作为Set并在BeverageEntity上实现equals/hashCode
-
如果您不希望
PERSIST创建新记录,请删除关联?在任何情况下,您确实希望保留与 CustomerOrder 关联的 BeverageEntities 的记录?如果不是,它根本不应该是Entity。如果是,您需要确保从数据库中检索 existing BeverageEntity 并将其添加到列表中,而不是每次都创建一个全新的。不幸的是,您的问题并不是 100% 清楚您希望它如何准确地工作。 -
Order 和 Beverage 实体之间存在关系。用户使用前端 JSP 订购饮料,因此在后端我需要记录包含用户订购的饮料的订单记录,然后我必须修改饮料实体内的数量并保留更新后的实体。跨度>