英文:
Unable to Insert Entity in Jpa with Composite key
问题
我有一个情况,我想将数据插入到一个具有复合主键的表中,每个复合主键部分都有多对一的关系。现在,当我尝试插入元素时,我收到一个错误,指出字段应该有默认值。请查看下面的内容。
@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: Field 'productId' doesn't have a default value
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    ...
英文:
I have a situation where I want to insert a data into a table that has a primary key as composite key and each part of composite key is many to one relationship.
Now when I try to insert a element, I get a error saying that field should have a default value. Please have a look below.
@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> {
}
Now when I try to insert a item in product_2_product_categories table like
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;
    }
I get a error saying
> java.sql.SQLException: Field 'productId' doesn't have a default value
> 	at
> com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
> ~[mysql-connector-java-8.0.19.jar:8.0.19]
答案1
得分: 0
使用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;
    }    
}
英文:
Create a secondary constructor with null as the default value, if null doesn't work go with 0, the null value will automatically be replaced with auto-generated 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;
    }    
}
专注分享java语言的经验与见解,让所有开发者获益!

评论