每个 Persist JPA 都会创建新实体

New Entity is created with every Persist JPA

我刚刚开始使用 JPA。我有一个实体 CustomerOrderEntity,它与另一个实体 BeverageEntity@OneToMany 关系。当我将 BeverageEntity 添加到 CustomerOrderEntity 时,会创建一个类型为 BeverageEntity 的新实体,并作为新记录保存在数据库中。我不想要这样的东西,我只需要 CustomerOrderEntity 来记录 BeverageEntity 并且不会在数据库中为它创建一个新实体。

这两个实体是从这个class 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);