GAE,JPA,XG事务,太多的实体组异常 [英] GAE, JPA, XG-transactions, too many entity groups exception

查看:132
本文介绍了GAE,JPA,XG事务,太多的实体组异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道在GAE的XG交易中有5个实体组有限制,但我认为我在一个交易中只使用3个组(Commodity,Category,CommodityCategory),并且仍然得到以下异常:
由以下原因引起: java.lang.IllegalArgumentException:在单个事务中操作的实体组太多。



以下是我的datamodel和dao代码的重要部分:



类别模型

  @Entity(name =Category)
public class类别扩展BaseDatastoreEntity {

私有字符串名称;
private key parentKey;
private String parentName;

@未知
@OneToMany(cascade = CascadeType.ALL)
私人设置< 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;
私人BigDecimal价格;


@OneToMany(mappedBy =commodity,cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private Set< Picture> pictures = new HashSet< Picture>();
@未知
@OneToMany(cascade = CascadeType.ALL)
私人设置< CommodityCategory> commodityCategories = new HashSet< CommodityCategory>();


public void addCommodityCategoryInternal(CommodityCategory commodityCategory){
this.commodityCategories.add(commodityCategory);
}

CommodityCategory模型

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

private boolean isDefaultCategory;
@未知
@ManyToOne(cascade = CascadeType.ALL)
私人钥匙商品;
@未知
@ManyToOne(cascade = CascadeType.ALL)
私钥类别;

$ b @SuppressWarnings(LeakingThisInConstructor)
public CommodityCategory(布尔isDefaultCategory,商品商品,类别类别){
super(true);
this.isDefaultCategory = isDefaultCategory;
this.commodity = commodity.getId();
this.category = category.getId();
category.addCommodityCategoryInternal(this);
commodity.addCommodityCategoryInternal(this); CommodityCategory DAO实现






$ b

pre> @Repository(commodityCategoryDAOImpl)
public class CommodityCategoryDAOImpl extends AbstractDAO< CommodityCategory,Key>执行CommodityCategoryDAO {

@Override
public CommodityCategory create(boolean isDefaultCategory,Commodity comm,Category cat){
EntityManager em = EMF.get()。createEntityManager();
setEntityManager(em);
getEntityManager()。clear();
getEntityManager()。getTransaction()。begin();
商品商品= getEntityManager()。find(Commodity.class,comm.getId());
Category category = getEntityManager()。find(Category.class,cat.getId());
CommodityCategory commodityCategory = new CommodityCategory(isDefaultCategory,商品,类别);
getEntityManager()。persist(commodityCategory);
getEntityManager()。getTransaction()。commit(); //这里是异常
getEntityManager()。
return commodityCategory;
}

任何想法为何不应该这样做?

感谢您的回复!

Pobo

解决方案

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



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


I know there is limit of 5 entity groups in XG-transaction on GAE but I think I am using only 3 groups(Commodity, Category, CommodityCategory) in one transaction and still getting this exception: Caused by: java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.

Here are vital parts of code of my datamodel and dao:

Category model

@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);
}

Commodity model

@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);
}

CommodityCategory model

@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 implementation

@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;
}

Any ideas why this shouldn't work?

Thanks for any answer!

Pobo

解决方案

I've got a similar problem. I try to get more than 5 entities of the same! type from GAE Datastore and get too many entity groups exception. So I think it doesnt depend on different types but on amout of persistence entity. Because each object of the same type has different entity group. When tried to get in transaction all of the object you have the problem .

So for getting list of the entity I don't use transaction anymore and it works

这篇关于GAE,JPA,XG事务,太多的实体组异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆