【问题标题】:Unable to Insert Entity in Jpa with Composite key无法使用复合键在 Jpa 中插入实体
【发布时间】:2020-07-23 05:06:42
【问题描述】:

我有一种情况,我想将数据插入到具有主键作为复合键的表中,并且复合键的每个部分都是多对一关系。 现在,当我尝试插入一个元素时,我收到一条错误消息,指出该字段应该具有默认值。请看下面。

@Entity
@Table(name = "products")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private long id;
}

@Entity
@Table(name = "product_categories")
public class ProductCategory {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private long id;
}

@Entity
@Table(name = "product_2_product_categories")
public class ProductToProductCategories {
    @EmbeddedId
    private ProductToProductCategoryId productToProductCategoryId;

    public ProductToProductCategories(){}

    public ProductToProductCategories(ProductToProductCategoryId productToProductCategoryId) {
        this.productToProductCategoryId = productToProductCategoryId;
    }

    public ProductToProductCategoryId getProductToProductCategoryId() {
        return productToProductCategoryId;
    }

    public void setProductToProductCategoryId(ProductToProductCategoryId productToProductCategoryId) {
        this.productToProductCategoryId = productToProductCategoryId;
    }
}

@Embeddable
public class ProductToProductCategoryId implements Serializable {
    @ManyToOne
    @JoinColumn(name = "productId", referencedColumnName = "id")
    private Product productId;

    @ManyToOne
    @JoinColumn(name = "productCategoryId",  referencedColumnName = "id")
    private ProductCategory productCategoryId;

    public ProductToProductCategoryId() {
    }

    public Product getProductId() {
        return productId;
    }

    public void setProductId(Product productId) {
        this.productId = productId;
    }

    public ProductCategory getProductCategoryId() {
        return productCategoryId;
    }

    public void setProductCategoryId(ProductCategory productCategoryId) {
        this.productCategoryId = productCategoryId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ProductToProductCategoryId)) return false;
        ProductToProductCategoryId that = (ProductToProductCategoryId) o;
        return Objects.equals(getProductId(), that.getProductId()) &&
                Objects.equals(getProductCategoryId(), that.getProductCategoryId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getProductId(), getProductCategoryId());
    }
}


@Repository
public interface Product2ProductCategoryJpaRepository extends JpaRepository<ProductToProductCategories, ProductToProductCategoryId> {
}

现在,当我尝试在product_2_product_categories 表中插入一个项目时

public Boolean saveOrUpdate(Long productId, Long productCategoryId) {
        Product product = productJpaRepository.findById(productId).get();
        ProductCategory productCategory = productCategoryJpaRepository.findById(productCategoryId).get();
        ProductToProductCategoryId productToProductCategoryId = new ProductToProductCategoryId();
        productToProductCategoryId.setProductCategoryId(productCategory);
        productToProductCategoryId.setProductId(product);
        product2ProductCategoryJpaRepository.save(new ProductToProductCategories(productToProductCategoryId));
        return true;
    }

我收到一个错误提示

java.sql.SQLException: 字段 'productId' 没有默认值 在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.19.jar:8.0.19]

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

    创建一个以null为默认值的二级构造函数,如果null不工作就用0,null值会自动替换为自动生成的id

    @Entity
    @Table(name = "products")
    public class Product {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="id")
        private long id;
    
        public Product(long id){
          this.id = id;
        }
    
        public Product(){
          this.id = null;
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 2021-01-09
      • 2017-09-04
      • 2015-10-24
      • 1970-01-01
      • 2017-05-25
      • 2015-01-06
      • 2019-10-09
      • 1970-01-01
      相关资源
      最近更新 更多