Google app engine App Engine JPA数据存储删除实体
我试图用JPA、JAX-RS和JAX-B构建一个google应用程序引擎项目。我的POST和GET方法可以工作,但我的DELETE方法不会删除数据 资源Google app engine App Engine JPA数据存储删除实体,google-app-engine,rest,jpa,Google App Engine,Rest,Jpa,我试图用JPA、JAX-RS和JAX-B构建一个google应用程序引擎项目。我的POST和GET方法可以工作,但我的DELETE方法不会删除数据 资源 @DELETE @Path("card/{id}") public void deleteCardById (@PathParam ("id") Long id) { Service.removeCard(id); } 服务 public static void removeCard(Long id) { Entity
@DELETE
@Path("card/{id}")
public void deleteCardById (@PathParam ("id") Long id) {
Service.removeCard(id);
}
服务
public static void removeCard(Long id) {
EntityManager em = EMFService.get().createEntityManager();
Card emp = findCard(id);
if (emp != null) {
em.remove(emp);
}
em.close();
}
public static Card findCard(Long id) {
EntityManager em = EMFService.get().createEntityManager();
Card card = em.find(Card.class, id);
em.close();
return card;
}
实体
@XmlRootElement
@Entity
public class Card {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String begriff;
String tabu1;
String tabu2;
String tabu3;
public Card(String begriff, String tabu1, String tabu2, String tabu3) {
super();
Begriff = begriff;
Tabu1 = tabu1;
Tabu2 = tabu2;
Tabu3 = tabu3;
}
public Card() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getBegriff() {
return Begriff;
}
public void setBegriff(String begriff) {
Begriff = begriff;
}
public String getTabu1() {
return Tabu1;
}
public void setTabu1(String tabu1) {
Tabu1 = tabu1;
}
public String getTabu2() {
return Tabu2;
}
public void setTabu2(String tabu2) {
Tabu2 = tabu2;
}
public String getTabu3() {
return Tabu3;
}
public void setTabu3(String tabu3) {
Tabu3 = tabu3;
}
@Override
public String toString() {
return "Card [Begriff=" + Begriff + ", Tabu1=" + Tabu1 + ", Tabu2="
+ Tabu2 + ", Tabu3=" + Tabu3 + "]";
}
当我调试应用程序时,它会为remove函数提供正确的对象。但是它只是不删除数据…你的意思是你正在使用GAE JPA插件的v1,并且你不需要在删除周围放置一个事务(因此删除会延迟到下一个事务…这永远不会发生)
很明显,你可以在删除的周围放置一个事务,或者更好的是使用GAE JPA插件的v2,好的,我想我应该这样写 *编辑问题是findCard函数,我想是因为EntityManager的secone实例。我在没有使用这个方法的情况下改变了它,现在它可以工作了
public static void removeCard(Long id) {
EntityManager em = EMFService.get().createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
Card card = em.find(Card.class, id);
if (card != null) {
em.remove(card);
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
em.close();
}
}
我也面临着类似的问题。JPA delete实际上会删除数据存储中的实体,但不会从JPA缓存中删除实体。。您的页面实际上正在使用JPA缓存结果列表来显示 我用来解决这个问题的方法是每次删除后都清除JPA缓存 示例代码如下所示:
EM.getTransaction().begin();
EM.remove(current_record);
EM.getTransaction().commit();
EM.getEntityManagerFactory().getCache().evictAll();
如果有什么“不起作用”(显然是使用该插件的v1),那么合乎逻辑的做法是查看日志中发生了什么。aka debugging他正在毫无问题地处理这个方法,并为remove方法提供了正确的对象,但是对象没有被删除