1

JPA、JAX-RS、JAX-Bを使用してGoogleAppEngineプロジェクトを構築しようとしています。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を使用していて、削除の前後にトランザクションを配置する必要がないということですか(したがって、削除は次のトランザクションまで遅延されます...これは決して発生しません)。

明らかに、削除の前後にトランザクションを配置するか、GAEJPAプラグインの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の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();
        }
    }
于 2012-07-10T13:27:34.860 に答える