jpa - 使用每个 Persist JPA 创建新实体
问题描述
我刚开始使用 JPA。我有一个与另一个实体CustomerOrderEntity
有@OneToMany
关系的实体BeverageEntity
。当我添加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;
}
}
解决方案
发现问题出在方法中toBeverageEntity
,正如评论中指出的那样,我正在创建一个错误的新实体。我需要使用find
,因为实体已经在数据库中。
BeverageEntity entity = em.find(BeverageEntity.class, beverage.getId());
entities.add(entity);
推荐阅读
- azure - Azure 容器注册表比从 hub.docker.com 获取图像慢
- ruby - 在无序遍历二叉搜索树时感到困惑
- windows - 如何安全地删除 Ubuntu EFI 分区并将 Windows EFI 分区移动到我在全新 Windows 安装期间创建的可用空间?
- html - 在 AWK 中打印多行
- python - 不一致的 Numpy 数组别名行为
- udp - 无法使用 sdn 和 opeflow ovs(UDP 版本)在 mininet 中正确设置防火墙
- java - 如何在每个 NavigationView 菜单组设置自己的样式
- tensorflow - 使用预训练网络的 Triplet-Loss
- javascript - Css / Jquery 切换左栏以从右侧而不是左侧打开
- react-native - 如何垂直对齐 expo react-native List.Item 中的图标?