使用每个持久化JPA创建新实体
我刚开始学JPA。我有一个实体使用每个持久化JPA创建新实体,jpa,entity,Jpa,Entity,我刚开始学JPA。我有一个实体CustomerOrderEntity,它与另一个实体BeverageEntity有@OneToMany关系。当我将BeverageEntity添加到CustomerOrderEntity时,将创建一个类型为BeverageEntity的新实体,并作为新记录保存在数据库中。我不想要这样的东西,我只需要CustomerOrderEntity就可以拥有BeverageEntity的记录,并且不会在数据库中为该记录创建新实体 BeverageEntity entity =
CustomerOrderEntity
,它与另一个实体BeverageEntity
有@OneToMany
关系。当我将BeverageEntity
添加到CustomerOrderEntity
时,将创建一个类型为BeverageEntity
的新实体,并作为新记录保存在数据库中。我不想要这样的东西,我只需要CustomerOrderEntity
就可以拥有BeverageEntity
的记录,并且不会在数据库中为该记录创建新实体
BeverageEntity entity = em.find(BeverageEntity.class, beverage.getId());
entities.add(entity);
这两个实体从此类调用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;
}
}
BeverageEntity
:
@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;
}
}
@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;
}
}
发现问题在于方法
toBeverageEntity
,正如我在评论中指出的那样,我正在创建一个错误的新实体。我需要使用find
,因为实体已经在数据库中
BeverageEntity entity = em.find(BeverageEntity.class, beverage.getId());
entities.add(entity);
如果您不能评论/建议某些内容,为什么要进行向下投票。您必须按设置实现beverageEntities,并在BeverAgeentity上实现equals/hashCode如果您不希望
持久化
创建新记录,请删除关联?在任何情况下,您是否希望保留与客户订单相关的BeverageEntities记录?如果不是,它就不应该是一个实体
。如果是,您需要确保从数据库中检索现有的BeverageEntity并将其添加到列表中,而不是每次都创建一个全新的BeverageEntity。不幸的是,您的问题并不是100%清楚您希望如何准确地工作。订单和饮料实体之间存在关系。用户使用前端JSP订购饮料,因此在后端,我需要有订单记录,其中包含用户订购的饮料,然后我必须修改饮料实体内的数量并保留更新的实体。