在broadleaf数据库中保留产品

时间:2016-06-21 14:57:03

标签: java spring hibernate broadleaf-commerce

我从其他来源获取产品和类别。我想将它们保存在broadleaf数据库中。我不想要自动生成的ID。我想坚持id来自源(从我获取产品等)到broadleaf数据库。

为此,我创建了自定义控制器:http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/admin/admin-custom-controllers

我在MyController中编写产品和类别持久代码。

我尝试过以下代码:

    Category category =  catalogService.createCategory();
    Long categoryId = new Long(453510);
    category.setId(categoryId);
    category.setName("test category4");
    category.setUrl("/test-category4");

    catalogService.saveCategory(category);

    Product p =  catalogService.createProduct(ProductType.PRODUCT);

    Sku newSku = catalogService.createSku();
    Long skuId = new Long(453520);
    newSku.setId(skuId);
    p.setDefaultSku(newSku);
    p.getDefaultSku().setDefaultProduct(p);

    p.setName("test product4");
    p.setUrl("/test-product4");
    p.setCategory(category);
    Long productId = new Long(453530);
    p.setId(productId);
    catalogService.saveProduct(p);

我正在关注stacktrace:

Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "blc_sku" violates foreign key constraint "fk28e82cf77e555d75"
  Detail: Key (default_product_id)=(453530) is not present in table "blc_product".
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:645)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:495)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:441)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

如果我删除下面的代码段,那么它会给我空指针,因为产品对象需要设置默认的sku。

Sku newSku = catalogService.createSku();
Long skuId = new Long(453520);
newSku.setId(skuId);
p.setDefaultSku(newSku);
p.getDefaultSku().setDefaultProduct(p);

请帮助我在broadleaf数据库中保留具有给定ID(非自动生成)的产品。

1 个答案:

答案 0 :(得分:2)

因为Hibernate被配置为在这些实体上生成id属性的值,所以即使您试图覆盖该值,Hibernate也会强制下一个生成的值。您的覆盖值似乎正在用于外键,并且正在为主键设置Hibernate生成的值,从而导致FK约束违规。

这些实体(类别,产品,sku)的设计假设用户将从外部系统导入,因此,每个实体都定义了externalId属性。建议的方法是让Hibernate通过生成器管理pk / fk值,然后externalId属性用于将外部系统映射到这些实体。

如果您的要求不允许使用externalId,您可以尝试使用加载时间编织来覆盖这些属性上的生成器注释。没有Broadleaf机制来覆盖属性上的现有注释,因此这将是您必须要探索的自定义。