JPA - 实体已经持久 - 使用GAE

时间:2014-06-21 16:14:50

标签: java android google-app-engine jpa

这个问题类似于这个问题,但问的人从未确认它是否有效。 entityManager.persist(user) -> javax.persistence.EntityExistsException: User@b3089 is already persistent

方案 ProductCategory 帐户之间存在OneToMany关系,与ManyToOne关系wuth ProductCategory成反比。插入ProductCategory时,帐户不可用。因此,在没有帐户的情况下插入了ProductCategory。稍后当帐户可用时,我想在帐户表中插入帐户,并使用帐户更新 ProductCategory 。问题在于更新ProducCategory中的帐户。当我对productCategory使用mgr.persist时,我收到错误实体已经是持久性!。当我不使用持久性时(根据建议链接,提供者(datanucleus)将负责在提交时将其写入数据库),它不会更新。实体和方法如下:

@Entity

public class ProductCategory {

    @Id
    @Column(name = "CAT_ID", allowsNull="false")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key catId;

    @Column(name = "CAT_SHORT_NAME", length=30)
    private String catShortName;

    //other fields

    @OneToMany(mappedBy="productCategory",targetEntity=Account.class, 
            fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private ArrayList<Account> accounts;  

        //getters & setters

@Entity

public class Account {

    @Id
    @Column(name = "ACCT_NBR_KEY", allowsNull="false")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key acctNbrKey;

    @Column(name = "CAT_ID")
    private Key acctCatId;

    //other fields

    @ManyToOne(optional=false, fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="CAT_ID",  insertable=false, updatable=false)
    private ProductCategory productCategory;

//getters & setters

AccountEndpoint.java


public void insertAccountBulk() {
        log.info("AccountEndpoint.insertAccountBulk....");

        Account account = new Account();

        ProductCategory pc = (new ProductCategoryEndpoint()).getProductCategoryByShortName("Savings");
        account.setProductCategory(pc);
        account.setAcctCatId(pc.getCatId());

        //setting other fields

        //updationg accounts in product category
            getEntityManager().detach(pc);
        if(pc.getAccounts() == null){
            ArrayList<Account> accts = new ArrayList<Account>();
            accts.add(account);
            pc.setAccounts(accts);
        }
        else{
            pc.getAccounts().add(account);
        }
        getEntityManager().merge(pc);    

        **//new ProductCategoryEndpoint().updateProductCategory(pc);** 

ProductCategoryEndpoint.java

@ApiMethod(name = "updateProductCategory")
public ProductCategory updateProductCategory(ProductCategory productcategory) {
    EntityManager mgr = getEntityManager();
    try {
        if (!containsProductCategory(productcategory)) {
            throw new EntityNotFoundException("Object does not exist");
        }
        mgr.persist(productcategory);
    } finally {
        mgr.close();
    }
    return productcategory;
}

    **If I uncomment new `ProductCategoryEndpoint().updateProductCategory(pc)` I get the error Entity already persistent.

如果我对其进行评论,则帐户不会在ProductCategory **

中更新

2 个答案:

答案 0 :(得分:0)

尝试更改@JoinColumn注释以允许ProductCategory的插入和更新。我认为这会阻止CategoriesAccount相关联。

@ManyToOne(optional=false, fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="CAT_ID")
private ProductCategory productCategory;

答案 1 :(得分:0)

根据您的其他问题判断您使用的是GAE / Datastore NOT RDBMS,因此未使用Hibernate - 请更新您的问题并删除该标记。

关于这个问题,如果实体已经是持久性的,那么当一个具有该Key的对象已经存在时(即你传递一个TRANSIENT对象来持久存在),你试图用一个特定的Key来持久化对象。你应该传递一个DETACHED对象到该方法。日志会告诉你

中的状态对象