Google app engine App Engine JPA数据存储删除实体

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

我试图用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) {
    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方法提供了正确的对象,但是对象没有被删除