2011-07-11 3 views
3

私はPlay!フレームワークを使用してプロジェクトを進めており、JPAに関するいくつかの問題を抱えています。それは私のリストを保存しないか、DBからそれを検索することができないようです。私は以下の通りであるコンストラクタ別のクラス、ModelManagerを、持っているPlayFrameworkとJPAを使用してリスト<Long>を発行する

@Entity 
public class User extends Model { 
    public String login; 
    public String password; 
    public String name; 
    public String email; 
    @ElementCollection 
    public List<Long> eventStreamIds; 
    @Transient 
    UserEventBuffer eventBuffer; 

    public User(String login, String password, String name, String email, ArrayList<Long> eventStreamIds) { 
     this.login = login; 
     this.password = password; 
     this.name = name; 
     this.email = email; 
     this.eventStreamIds = eventStreamIds; 
      UserEventBuffer eventBuffer = new UserEventBuffer(); 
     } 
} 

:ここ

は私のUserクラスである

public ModelManager() { 
    User u = new User("user1", "pwd", "Alex", "[email protected]"); 
    EventStreamMC eb = new EventStreamMC("http://www.wservice.com/stream1"); 
    streams.add(eb); 
    u.eventStreamIds.add(eb.id); 
    Logger.info("before : " + u.eventStreamIds.size()); 
    u.save(); 
    User u2 = User.find("byLoginAndPassword", "user1", "pwd").first(); 
    Logger.info("after : " + u2.eventStreamIds.size()); 
} 

(マイEventStreamMCもモデルを拡張し、@Entityタグを持っています、)そのロングIDが自動的に生成されるので、 私はこのコードを実行すると、ここでの結果である:

before = 1 
after = 0 

したがって、find()メソッドの呼び出し後にListは空です。

どうすればいいですか?

+0

DBに簡単に目を通すほうがずっと簡単なので、問題が保存か検索であるかどうかを知ることができます。たとえば、pwdで2つのuser1がある場合、動作しません。 – niels

+0

devモードでDBをどのように調べることができますか? –

+0

単純な実データベースを使用します。あなたはモジュール[コンソール](https://github.com/playframework/play/blob/master/modules/console/documentation/home.textile)を試すことさえできます。あなたの取引がコミットされていることを確認してください。 – niels

答えて

4

IDは保存時にのみ生成され、ebは決してコードに保存されません。 ed.idは、リストに追加すると空になります。

EDIT:

私は私の説明でさらに少し行きますよ。

最初のロガーはJava Listオブジェクトであるため、1を返しています。これは単純なリストです。要素を追加するとサイズが大きくなります。驚きはありません。プレーンJava。 Playとはまったく関係ありません。

IDがコミット時に事前に生成されているため、第2のロガーに何も表示されません。そして、あなたはまだ同じトランザクションに入っているので、実行の最後までセーブは実行されません。詳細については、

Model.em().getTransaction().commit(); 

Transactionsの公式プレイドキュメントをチェックアウト:あなたは本当にこれが同じhttpリクエスト/トランザクションで仕事をしたい場合は、これを使用します。

+0

だから、最初のLogger.info()が1を返すとどう説明しますか? –

+0

いいえ、eb.idは実際にはnullでしたが、とにかくnull値として保存されているはずです。 e.eventStreamIds.add(eb.id)の前にeb.save()を追加しましたが、結果は同じですが、find()の後もリストはまだ空です。( –

+0

もう少し詳しい情報を追加しました私のポストで!;) –

関連する問題