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;
}
これがうまくいかない理由はありますか?
答えてくれてありがとう!
ポボ