3

オブジェクトを自動的に永続化するJPAを回避する方法はありますか?

サードパーティのAPIを使用する必要があり、データをそこからプル/プッシュする必要があります。APIのインターフェースを担当するクラスがあり、次のようなメソッドがあります。

public User pullUser(int userId) {
    Map<String,String> userData = getUserDataFromApi(userId);
    return new UserJpa(userId, userData.get("name"));
}

クラスUserJpaは次のようになります。

@Entity
@Table
public class UserJpa implements User
{
    @Id
    @Column(name = "id", nullable = false)
    private int id;

    @Column(name = "name", nullable = false, length = 20)
    private String name;

    public UserJpa() {
    }

    public UserJpa(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

メソッド(例)を呼び出すとpullUser(1)、返されたユーザーは自動的にデータベースに保存されます。私はこれが起こらないようにしたいのですが、それを回避するための解決策はありますか?User解決策は、実装する新しいクラスを作成し、メソッドでこのクラスのインスタンスを返すことである可能性があることを知っていますがpullUser()、これは良い習慣ですか?

ありがとうございました。

4

3 に答える 3

6

UserJpaの新しく作成されたインスタンスは、pullUserに永続化されません。また、getUserDataFromApiには、同じIDに対して実際に何かを永続化する奇妙な実装はないと思います。

あなたの場合、エンティティマネージャはUserJPAの新しいインスタンスについて何も知りません。通常、エンティティは、マージ/永続化呼び出しを介して、またはカスケードされたマージ/永続化操作の結果として永続化されます。コードベースの他の場所でこれらを確認してください。

于 2012-04-24T18:41:15.940 に答える
0

EntityManager新しいエンティティがJPAに永続化される唯一の方法は、 'persist()またはmerge()メソッドを明示的に呼び出すことです。コードを調べて、それらのいずれかへの呼び出しを探します。これは、永続化操作が発生しているポイントであり、コードをリファクタリングして、他の場所で永続化を実行します。

于 2012-04-24T18:38:45.810 に答える
0

通常、JPAオブジェクトは管理対象オブジェクトであり、これらのオブジェクトは、トランザクションが完了したとき、およびその前に第1レベルのキャッシュに変更を反映します。明らかに、これらのオブジェクトは最初に管理対象になる必要があります。

ベストプラクティスは、DTOオブジェクトを使用してデータ転送を処理し、永続性の目的でのみエンティティを使用することです。そうすれば、よりまとまりがあり、結合が少なくなります。これは、本来あるべき場所に鼻があるオブジェクトではありません。

それが役に立てば幸い。

于 2012-04-24T18:41:21.527 に答える