每个Persist JPA都会创建新实体

时间:2019-12-03 12:16:17

标签: jpa entity

我刚开始使用JPA。我有一个实体CustomerOrderEntity与另一个实体@OneToManyBeverageEntity关系。当我将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;
    }
}

1 个答案:

答案 0 :(得分:0)

发现问题出在方法toBeverageEntity中,正如注释中指出的那样,我正在创建一个错误的新实体。我需要使用find,因为该实体已经在数据库中。

BeverageEntity entity = em.find(BeverageEntity.class, beverage.getId());
                entities.add(entity);
相关问题