2012-07-10 111 views
1

即时通讯尝试与JPA,JAX-RS和JAX-B构建谷歌应用程序引擎项目。我的POST和GET方法工作,但我的DELETE方法不会删除数据。应用程序引擎JPA数据存储删除实体

资源

@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 + "]"; 
    } 

当我调试它给正确的对象为删除功能的应用程序。但它只是不会删除数据...

回答

2

你的意思是你使用GAE JPA插件的v1,而且你不必为你的删除而放置一个事务(所以删除被延迟到下一个交易......从来没有发生过)?

显然,你既可以把一个交易周围的删除,或者更好的是你用GAE JPA插件

0

好吧,我想我应该写这样的 *编辑V2的问题是findCard功能,我认为是因为EntityManager的secone实例。我chnaged它没有使用这种方法,现在它的工作。

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(); 
     } 
    } 
+0

如果有什么“不工作”(明确使用该插件的V1),然后做顺理成章的事情是看在日志中在发生什么事。又名调试 – DataNucleus 2012-07-10 13:41:01

+0

他正在经历这个方法,没有任何问题,并且给remove方法提供了正确的对象,但是这个对象并没有被移除 – AdrianoCelentano 2012-07-10 13:52:47

1

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

我用来解析问题是每次删除后都要清除JPA Cache。

示例代码将是这样的:

EM.getTransaction().begin(); 

EM.remove(current_record); 

EM.getTransaction().commit(); 
EM.getEntityManagerFactory().getCache().evictAll(); 
相关问题