1

Google App EngineとJPAを使用して、1対多の双方向の関係を実装しています。自宅のマシンでアプリケーションをデバッグしてテストすると、すべてが正常に機能しますが、App Engineにデプロイした後、永続性が機能しなくなるようです。

これは私が持っているモデルです(簡単にするために削除しました):

User.java:

@Entity
class User implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;

    @OneToMany(mappedBy = "owner",
               cascade = CascadeType.ALL,
               fetch = FetchType.EAGER)
    private List<Book> books;

    public getBooks() { return this.books; }
}

Book.java:

@Entity
class Book implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;

    @ManyToOne(fetch = FetchType.LAZY)
    private User owner;

    private String name;
}

新しいを作成するにはUser

User user = new User()

// This is done just for testing. It works fine.
user.getBooks().add(new Book("TEST"))

EntityManager em = /* ... */
EntityTransaction transaction = em.getTransaction();

try
{
    transaction.begin();
    em.persist(user);
    transaction.commit();
}

/* Exceptions handling. */

finally
{
    if (transaction.isActive())
        transaction.rollback();

    em.close();
}

そして本を追加するには:

User user = /* ... */
Book book = new Book("A new book");

user.getBooks().add(book);

EntityManager em = /* ... */
EntityTransaction transaction = em.getTransaction();

try
{
    transaction.begin();
    /* user.getBooks().add(book);  - placing this here doesn't change anything */
    em.merge(user);
    transaction.commit();
}

/* Exceptions handling. */

finally
{
    if (transaction.isActive())
        transaction.rollback();

    em.close();
}

ユーザーと一緒に作成される「テスト」ブックを追加する前に私が見たのは、最初のブックエンティティの作成は問題なく機能するということですが、のブックエンティティを作成するたびに、前のブックはデータストアから何らかの形で削除されます。作成したばかりの新しいものに置き換えられました(本の名前からわかります)。そのため、同じユーザーに対して複数の本を作成することはできません。

どういうわけかBookエンティティの永続性を台無しにしたかどうかを確認しようとしました。そのため、「TEST」ブックを追加しました。問題は解決しませんが、最初の本( "TEST")があり、新しい本を追加しようとするたびに、リストの2番目の本を置き換え続けます。

繰り返しますが、これは、アプリケーションをデバッグするときは発生せず、デプロイした後でのみ発生します。

を呼び出すem.persist(book)前に呼び出してみましem.merge(user)たが、永続化されたときにブックの所有者が既に設定されており、変更できないという例外が発生しました。(このスレッドのように)自分で関係を設定しようとしましたが、本を追加するときにトランザクションが失敗しました。

関連性があるかどうかはわかりませんが、表示される「本」列のタイプは次のdatastore_types.Key.from_pathようになります。

[datastore_types.Key.from_path(u'User', 9001L, u'Book', 1L, _app=u's~myapp'),
 datastore_types.Key.from_path(u'User', 9001L, u'Book', 2001L, _app=u's~myapp')]

どんな助けでもいただければ幸いです、ありがとう!

4

1 に答える 1

1

以下でお試しいただけますか:

User user = /* ... */
Book book = new Book("A new book");

book.setOwner(user);

EntityManager em = /* ... */
EntityTransaction transaction = em.getTransaction();

try{
    transaction.begin();
    em.persist(user);
    transaction.commit();

}finally{
    if (transaction.isActive())
        transaction.rollback();

    em.close();
}
于 2012-12-26T06:01:30.910 に答える