1

我试图用 JPA、JAX-RS 和 JAX-B 构建一个谷歌应用引擎项目。我的 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 + "]";
    }

当我调试应用程序时,它会为删除函数提供正确的对象。但它只是不删除数据......

4

3 回答 3

2

您的意思是您使用的是 GAE JPA 插件的 v1,并且您不必费心在您的删除周围放置一个事务(因此删除会延迟到下一个事务......这永远不会发生)?

显然,您可以围绕删除进行事务处理,或者最好还是使用 GAE JPA 插件的 v2

于 2012-07-10T12:53:50.217 回答
1

我也面临类似的问题。JPA 删除实际上删除了数据存储中的实体,但它不会从 JPA 缓存中删除实体。您的页面实际上是使用 JPA 缓存结果列表来显示..

我用来解决问题的方法是每次删除后都清除 JPA 缓存。

示例代码将是这样的:

EM.getTransaction().begin();

EM.remove(current_record);

EM.getTransaction().commit();
EM.getEntityManagerFactory().getCache().evictAll();
于 2013-06-08T05:14:32.977 回答
0

好的,我想我应该这样写 *编辑问题是 findCard 函数,我认为是因为 EntityManager 的第二个实例。我在没有使用这种方法的情况下对其进行了更改,现在它可以工作了。

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();
        }
    }
于 2012-07-10T13:27:34.860 回答