0

私は個人的なプロジェクトに取り組んでいますが、何時間もの調査とデバッグを行っても解決できないような奇妙な問題があるので、明らかにそれは非常に単純なことであるに違いありません。とにかく、コンテキストは、JPA + PostgresSQL+Glassfishです。私はエンティティ(netbeansによって生成された)MvUserを持っています:

@Id
@Basic(optional = false)
@NotNull
@Column(name = "id")
@SequenceGenerator(name="mv_user_autoincrement_gen",sequenceName     ="mv_user_autoincrement",allocationSize=1)  
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="mv_user_autoincrement_gen") 
private Long id;

次に、すべてのボイラープレート永続化コードのジェネリックを含むAbstractFacadeがあります。
ここに私はあまり何もしない方法があります、ただ:

@Override
public void create(T entity) {
    getEntityManager().persist(entity);
}

ここで、サービスクラスでこれを呼び出したとしましょう。最初にファサードを注入します。

@EJB
IMvUserFacade userFacade;

それから私はそれを使用します:

@Override
public void saveUser(MvUser user)
{
    userFacade.create(user);
    // more business specific code follows
}  

このようなサービスに電話をかけます

MvUser = new MvUser();
... setters etc
mvUserService.saveUser(user);

さて、何が起こっているのかというと、createメソッドでオブジェクトが永続化され、生成されたIDとすべてがあります。チェーン全体でオブジェクトパラメータを持っているので、saveUserレベルで同じオブジェクトが見つかると思いますが、いいえ、切り離されたエンティティが残っています。私が間違っているのは何ですか?ありがとう。

4

1 に答える 1

0

私の理解が正しければ、create() で保存したオブジェクトを検索する必要があります。オブジェクトはまだデータベースに永続化されていないと思います。取得するのは、まだトランザクション内にあるため、最初のレベルのキャッシュhttp://www.tutorialspoint.com/hibernate/hibernate_caching.htmからのオブジェクトです。次のようにオブジェクトを取得しようとして、メソッド saveUser() がトランザクション内にない場合、データベースからユーザー オブジェクトを取得します (ただし、トランザクション外であるため切り離されます)。

public void saveUser(MvUser user)
{
userFacade.create(user);
userFacade.get(userId);
// more business specific code follows
} 
于 2013-02-10T10:22:37.370 に答える