GAE에서 XG- 트랜잭션에 5 개의 엔티티 그룹이 있다는 것을 알고 있지만 한 트랜잭션에서 3 개의 그룹 (상품, 카테고리, 상품 카테고리)만을 사용하고 있다고 생각합니다. 그리고 여전히이 예외가 발생합니다 : 발생 원인 : java.lang.IllegalArgumentException : 단일 트랜잭션에서 너무 많은 엔티티 그룹에서 작동합니다.GAE, JPA, XG- 트랜잭션, 너무 많은 엔티티 그룹 예외
분류 모델
@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);
}
: 여기
내 데이터 모델의 코드와 DAO의 중요한 부분이다 상품 카테고리 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;
}
왜 이런 식으로 작동하지 않아야하나요?
모든 답변 주셔서 감사합니다.
포보
감사를 작동하지만 새로운 CommodityCategory 객체를 지속하고 때 오류가 발생합니다. 그리고 1 카테고리의 객체와 1 상품 객체 만 있으므로 5+에 문제가 없을 것입니다. 목록 검색에 트랜잭션을 사용하지 않습니다. – Pobo