1

Play 1.2.x アプリケーションで奇妙な動作を見つけました

たとえば、次のコードがあります。

アプリ/モデル/Account.java:

package models;

import javax.persistence.Entity;

import play.db.jpa.Model;

@Entity
public class Account extends Model {

    public String username;
}

アプリ/coutrollers/Application.java:

package controllers;

import play.mvc.Controller;

import java.util.List;

import models.Account;

public class Application extends Controller {

    public static void index() {
        Account account = Account.find("username LIKE ?", "username1").first();
        account.username = "username3";
        List<Account> accounts = Account.all().fetch();
        render(account, accounts);
    }
}

アプリ/ビュー/アプリケーション/index.html:

#{extends 'main.html' /}
#{set title:'Home' /}

<h2>Working!</h2>

${account.username}

<ul>
  #{list items:accounts, as:'acc'}
    <li>${acc.username}</li>
  #{/list}
</ul>

データベースに次のアカウントがある場合:

  • ユーザー名1
  • ユーザー名2

出力は次のようになります。

働く!

ユーザー名3

  • ユーザー名3
  • ユーザー名2

ただし、次のようにする必要があります。

働く!

ユーザー名3

  • ユーザー名1
  • ユーザー名2

これは何ですか???

  • バグを再生しますか?
  • Java静的コンテキスト機能?
  • JPA機能?
  • ...?

解決済み

@ミリムースをありがとう。必要なのは次のdetach()とおりです。

package controllers;

import play.mvc.Controller;

import java.util.List;

import models.Account;

import play.db.jpa.JPA;

public class Application extends Controller {

    public static void index() {
        Account account = Account.find("username LIKE ?", "username1").first();
        account.username = "username3";
        JPA.em().detach(account);
        List<Account> accounts = Account.all().fetch();
        render(account, accounts);
    }
}
4

1 に答える 1

2

JPA は、地球上の他のすべての ORM と同じように機能します。つまり、同じデータベース レコードを 2 回検索すると、同じオブジェクトが取得されます。.first()クエリは (作業単位内で行われた変更を追跡するために) を内部的にキャッシュし、Account呼び出し.all().fetch()はそのキャッシュされたオブジェクトを再び提供します。

私は遊びに慣れていません!ORM のものですが、「生の」JPA はEntityManager.detach()、特定のエンティティ インスタンスの追跡を停止する必要があります。(したがって、対応する DB レコードが再度取得されるたびに、新しいコピーが提供されます。)

于 2013-03-19T11:50:46.867 に答える