Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用每个持久化JPA创建新实体_Jpa_Entity - Fatal编程技术网

使用每个持久化JPA创建新实体

使用每个持久化JPA创建新实体,jpa,entity,Jpa,Entity,我刚开始学JPA。我有一个实体CustomerOrderEntity,它与另一个实体BeverageEntity有@OneToMany关系。当我将BeverageEntity添加到CustomerOrderEntity时,将创建一个类型为BeverageEntity的新实体,并作为新记录保存在数据库中。我不想要这样的东西,我只需要CustomerOrderEntity就可以拥有BeverageEntity的记录,并且不会在数据库中为该记录创建新实体 BeverageEntity entity =

我刚开始学JPA。我有一个实体
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订购饮料,因此在后端,我需要有订单记录,其中包含用户订购的饮料,然后我必须修改饮料实体内的数量并保留更新的实体。