2016-06-21 36 views
1

我从其他来源提取产品和类别。我想坚持他们在宽阔的数据库。我不想要自动生成的ID。我想坚持id来源(我从哪里获取产品等)到broadleaf数据库。坚持在阔叶数据库产品

对于我创建我的自定义控制器:http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/admin/admin-custom-controllers

我写的产品和类别中坚持myController的代码。

我曾尝试下面的代码:

我得到以下堆栈跟踪:

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(不是自动生成)的产品。

回答

2

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

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

如果您的要求不允许使用externalId,您可以查看试图使用加载时织入来覆盖这些属性上的生成器批注。没有Broadleaf机制来覆盖属性上的现有注释,所以这将是您必须探索的定制。

+0

谢谢,externalId在我的情况下工作。 –

+0

Broadleaf提供任何可以从CSV文件或其他文件合成器导入数据的功能? –