【问题标题】:JPA with @Embeddable Primary Key generates JDBC INSERT for PK带有@Embeddable Primary Key 的 JPA 为 PK 生成 JDBC INSERT
【发布时间】:2016-07-12 20:04:05
【问题描述】:

为什么我会从 JPA 获得包含主键的 JDBC INSERT 语句?

原因: org.apache.openjpa.persistence.EntityExistsException:无法插入 表“ProductionDetail”中标识列的显式值 IDENTITY_INSERT 设置为 OFF。 {prepstmnt 6933355 插入 ProductionDetail(BranchID、Date、DepartmentID、Price、 ProductionDetailID、Count、LastUpdated、Notes、LastUpdatedByUser) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)} [code=544, state=23000]

tomcat-8.5.3-tomee7 / EclipseLink JPA 2.1 / NetBeans 8.1 从现有数据库生成实体类 / NetBeans 8.1 从实体类生成会话 bean

public class ProductionDetail implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected ProductionDetailPK productionDetailPK;

@Embeddable
public class ProductionDetailPK implements Serializable {
    @Basic(optional = false)
    @NotNull
    @Column(name = "ProductionDetailID")
    private int productionDetailID;

public class UnmanagedClass implements Command {
    List<ProductionDetail> productionDetailsToInsert = new ArrayList<>();

    ProductionDetail productionDetailEntity;    //at this point ProductionDetailPK is null

//at this point ProductionDetailPK.ProductionDetailID defaults to 0, logically meaningless
ProductionDetailPK productionDetailPK = new ProductionDetailPK();    

        productionDetailPK.setBranchID(Integer.parseInt(request.getParameter("branchId")));
        productionDetailPK.setDepartmentID(Integer.parseInt(request.getParameter("department")));
        productionDetailPK.setDate(productionDate);
        productionDetailPK.setPrice(new BigDecimal(priceOrId));
        productionDetailEntity.setBranches(branches);
        productionDetailEntity.setDepartment(department);
        productionDetailEntity.setCount(Integer.parseInt(count));

        productionDetailEntity.setProductionDetailPK(productionDetailPK);

productionDetailsToInsert.add(productionDetailEntity);

insertProductionDetails(productionDetailsToInsert)
}

public void insertProductionDetails(List<ProductionDetail> ProductionDetailsList) {
    for (ProductionDetail productionDetail : ProductionDetailsList) {
        //getEntityManager().persist(entity);
        this.productionDetailFacade.create(productionDetail);    
    }
}

【问题讨论】:

    标签: jpa


    【解决方案1】:

    原来我有一个表,其中我设置的所有列加上 Identity 列都是聚集约束的一部分。 JPA 希望将所有列设置为约束的一部分。我很确定在我清理完之后我会回到正轨。再次感谢您的收听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多