2013-05-21 1 views
2

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

왜 이런 식으로 작동하지 않아야하나요?

모든 답변 주셔서 감사합니다.

포보

답변

1

나는 비슷한 문제가있다. 나는 같은 5 개 이상의 실체를 얻으려고 노력합니다! GAE Datastore에서 입력하고 너무 많은 엔티티 그룹 예외가 발생합니다. 그래서 나는 그것이 다른 유형에 의존하지 않는다고 생각하지만, 지속성 엔티티에 대해서는 그렇지 않습니다. 왜냐하면 같은 유형의 각 객체는 서로 다른 엔티티 그룹을 가지고 있기 때문입니다. 모든 객체의 트랜잭션을 가져 오려고 할 때 문제가 발생했습니다.

그래서 더 이상 내가 트랜잭션을 사용하지 않는 개체의 목록을 가져 오는 그것은 답장을

+0

감사를 작동하지만 새로운 CommodityCategory 객체를 지속하고 때 오류가 발생합니다. 그리고 1 카테고리의 객체와 1 상품 객체 만 있으므로 5+에 문제가 없을 것입니다. 목록 검색에 트랜잭션을 사용하지 않습니다. – Pobo

관련 문제