【问题标题】:GAE, JPA, XG-transactions, too many entity groups exceptionGAE、JPA、XG-transactions、太多实体组异常
【发布时间】:2013-05-21 16:33:20
【问题描述】:

我知道 GAE 上的 XG-transaction 中有 5 个实体组的限制,但我认为我在一次交易中只使用了 3 个组(商品、类别、商品类别)并且仍然遇到此异常: 原因:java.lang.IllegalArgumentException:在单个事务中操作了太多实体组。

以下是我的数据模型和 dao 代码的重要部分:

类别模型

@Entity(name = "Category")  
public class Category extends BaseDatastoreEntity{

private String name;    
private Key parentKey;    
private String parentName;

@Unowned
@OneToMany(cascade= CascadeType.ALL)
private Set<CommodityCategory> commodityCategories = new HashSet<CommodityCategory>();
.
.
public void addCommodityCategoryInternal(CommodityCategory commodityCategory) {       
  this.commodityCategories.add(commodityCategory);
}

商品模型

@Entity(name = "Commodity")
public class Commodity extends BaseDatastoreEntity implements IRateable{

private String name;    
private BigDecimal price; 
.
.    
@OneToMany(mappedBy = "commodity", cascade= CascadeType.ALL, fetch= FetchType.EAGER)
private Set<Picture> pictures = new HashSet<Picture>();
@Unowned        
@OneToMany(cascade= CascadeType.ALL)
private Set<CommodityCategory> commodityCategories = new HashSet<CommodityCategory>();
.
.
public void addCommodityCategoryInternal(CommodityCategory commodityCategory) {       
  this.commodityCategories.add(commodityCategory);
}

商品类别模型

@Entity(name="CommodityCategory")
public class CommodityCategory extends BaseDatastoreEntity{

private boolean isDefaultCategory;
@Unowned 
@ManyToOne(cascade= CascadeType.ALL)
private Key commodity;
@Unowned 
@ManyToOne(cascade= CascadeType.ALL)
private Key category;


@SuppressWarnings("LeakingThisInConstructor")
public CommodityCategory(boolean isDefaultCategory, Commodity commodity, Category category) {  
    super(true);
    this.isDefaultCategory = isDefaultCategory;
    this.commodity = commodity.getId();
    this.category = category.getId();        
    category.addCommodityCategoryInternal(this);
    commodity.addCommodityCategoryInternal(this);
}

CommodityCategory DAO 实现

@Repository("commodityCategoryDAOImpl")
public class CommodityCategoryDAOImpl extends AbstractDAO<CommodityCategory, Key> implements CommodityCategoryDAO{

@Override
public CommodityCategory create(boolean isDefaultCategory, Commodity comm, Category cat) {
    EntityManager em = EMF.get().createEntityManager();       
    setEntityManager(em);           
    getEntityManager().clear();
    getEntityManager().getTransaction().begin();  
    Commodity commodity = getEntityManager().find(Commodity.class, comm.getId());        
    Category category = getEntityManager().find(Category.class, cat.getId());
    CommodityCategory commodityCategory = new CommodityCategory(isDefaultCategory, commodity, category);         
    getEntityManager().persist(commodityCategory);
    getEntityManager().getTransaction().commit();//here is the exception
    getEntityManager().clear();
    return commodityCategory;
}

任何想法为什么这不应该工作?

感谢您的任何回答!

波波

【问题讨论】:

    标签: java google-app-engine jpa datanucleus


    【解决方案1】:

    我也有类似的问题。我尝试获得超过 5 个相同的实体!从 GAE 数据存储中键入并获取太多实体组异常。所以我认为它不依赖于不同的类型,而是依赖于持久性实体的数量。因为同一类型的每个对象都有不同的实体组。当试图进入事务所有你有问题的对象时。

    所以为了获取实体列表,我不再使用事务并且它可以工作

    【讨论】:

    • 感谢您的回复,但是当我坚持新的 CommodityCategory 对象时会发生该错误。而且只有 1 个 Category 对象和 1 个 Commodity 对象,所以 5+ 应该没有问题。我不使用事务来检索列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2021-05-16
    • 2014-08-12
    相关资源
    最近更新 更多