2011-04-20 49 views
4

我希望有人能为我阐明这一点。我真的不明白这个错误是怎么回事。我有一个实体用于在数据库中创建多个条目。当事务结束并且同步完成时,我会收到illegalStateException。这些都是从提供所有数据的Web服务中填充数据库的过程。现在我已经以不会导致任何外键约束错误的方式解析数据,但与实体的关系阻止了我。JPA illegalStateException - CascadeType问题

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: entities.cmic.ajrs.com.Categories[pkId=null]. 

我试图坚持的实体称为ProductBase。 ProductBase有一个名为pkBrand的外键与品牌数据表以及相应的实体品牌数据。

我可以为这些关系设置CascadeType为ALL,但我真的不想在此时创建该实体。

下面是实体(减去一些getter和setter)

@Entity 
@Table(name = "product_base") 
@NamedQueries({ 
    @NamedQuery(name = "ProductBase.findAll", query = "SELECT p FROM ProductBase p"), 
    @NamedQuery(name = "ProductBase.findByPkId", query = "SELECT p FROM ProductBase p WHERE p.pkId = :pkId"), 
    @NamedQuery(name = "ProductBase.findByColorsAvail", query = "SELECT p FROM ProductBase p WHERE p.colorsAvail = :colorsAvail"), 
    @NamedQuery(name = "ProductBase.findBySeriesName", query = "SELECT p FROM ProductBase p WHERE p.seriesName = :seriesName"), 
    @NamedQuery(name = "ProductBase.findByStatusCodes", query = "SELECT p FROM ProductBase p WHERE p.statusCodes = :statusCodes"), 
    @NamedQuery(name = "ProductBase.findByTs", query = "SELECT p FROM ProductBase p WHERE p.ts = :ts")}) 
public class ProductBase implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "pk_id") 
    private Integer pkId; 
    @Column(name = "colors_avail") 
    private String colorsAvail; 
    @Column(name = "series_name") 
    private String seriesName; 
    @Column(name = "status_codes") 
    private String statusCodes; 
    @Basic(optional = false) 
    @Column(name = "ts") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date ts; 
    @OneToMany(mappedBy = "productBase", fetch = FetchType.LAZY) 
    private Collection<ProductSorts> productSortsCollection; 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "productBase", fetch = FetchType.LAZY) 
    private MapTarget mapTarget; 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "productBase", fetch = FetchType.LAZY) 
    private KeyFeatures keyFeatures; 
    @JoinColumn(name = "pk_category", referencedColumnName = "pk_id") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Categories categories; 
    @JoinColumn(name = "pk_brand", referencedColumnName = "pk_id") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private BrandData brandData; 
    @OneToMany(mappedBy = "productBase", fetch = FetchType.LAZY) 
    private Collection<PromotionsByModel> promotionsByModelCollection; 
    @OneToMany(mappedBy = "productBase", fetch = FetchType.LAZY) 
    private Collection<ProductEnhancedFeatures> productEnhancementFeaturesCollection; 
    @OneToMany(mappedBy = "productBase", fetch = FetchType.LAZY) 
    private Collection<SkuBasic> skuBasicCollection; 
    @OneToMany(mappedBy = "productBase", fetch = FetchType.LAZY) 
    private Collection<ProductMeasurements> productMeasurementsCollection; 

    public ProductBase() { 
    } 


@Entity 
@Table(name = "brand_data") 
@NamedQueries({ 
    @NamedQuery(name = "BrandData.findAll", query = "SELECT b FROM BrandData b"), 
    @NamedQuery(name = "BrandData.findByPkId", query = "SELECT b FROM BrandData b WHERE b.pkId = :pkId"), 
    @NamedQuery(name = "BrandData.findByCommonBrandId", query = "SELECT b FROM BrandData b WHERE b.commonBrandId = :commonBrandId"), 
    @NamedQuery(name = "BrandData.findByCommonBrandName", query = "SELECT b FROM BrandData b WHERE b.commonBrandName = :commonBrandName"), 
    @NamedQuery(name = "BrandData.findByTs", query = "SELECT b FROM BrandData b WHERE b.ts = :ts")}) 
public class BrandData implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "pk_id") 
    private Integer pkId; 
    @Column(name = "common_brand_id") 
    private String commonBrandId; 
    @Column(name = "common_brand_name") 
    private String commonBrandName; 
    @Basic(optional = false) 
    @Column(name = "ts") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date ts; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "brandData", fetch = FetchType.LAZY) 
    private Collection<ProductBase> productBaseCollection; 

    public BrandData() { 
    } 
+0

复数类名称使用不当... – Kawu 2015-12-09 14:28:38

回答

4

异常清楚地说的CategoriesProductBase引用未保存的实例。

如果这是故意的,而且您实际上想要保存Categories的新实例,则可以在保存ProductBase之前手动配置该关系的级联或手动保存该实例。

否则,如果ProductBase应引用Categories的现有持久实例,则需要从数据库加载该实例,而不是创建新实例。

+0

谢谢。这正是我所想的问题所在。我尝试了首次提交类别保存,但没有运气。我会回头看看。 – grantk 2011-04-20 21:05:59