这个问题类似于这个问题,但问的人从未确认它是否有效。 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
**
答案 0 :(得分:0)
尝试更改@JoinColumn
注释以允许ProductCategory
的插入和更新。我认为这会阻止Categories
与Account
相关联。
@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对象到该方法。日志会告诉你
中的状态对象