2

GAE の XG トランザクションには 5 つのエンティティ グループの制限があることはわかっていますが、1 つのトランザクションで 3 つのグループ (Commodity、Category、CommodityCategory) のみを使用していて、まだこの例外が発生していると思います。 1 つのトランザクションでエンティティ グループが多すぎます。

私のデータモデルと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);
}

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

これがうまくいかない理由はありますか?

答えてくれてありがとう!

ポボ

4

1 に答える 1

1

同様の問題があります。同じエンティティを 5 つ以上取得しようとしています。GAE データストアから入力すると、エンティティ グループの例外が多すぎます。したがって、さまざまなタイプではなく、永続エンティティの量に依存すると思います。同じタイプの各オブジェクトには異なるエンティティ グループがあるためです。すべてのオブジェクトをトランザクションで取得しようとすると、問題が発生します。

したがって、エンティティのリストを取得するために、トランザクションを使用しなくなり、機能します

于 2013-05-27T07:05:00.857 に答える