10

JPA 2.0はEntityListenerへのインジェクションをサポートしていないため(JPA 2.1はサポートします)、JNDIルックアップを使用しBeanManagerてログインユーザーを取得することにしました。EntityListener私はこれに似たものを定義しました:

public class MyEntityListener {

    public static BeanManager getBeanManager() {
        try {
            InitialContext initialContext = new InitialContext();
            return (BeanManager) initialContext.lookup("java:comp/BeanManager");
        } catch (NamingException e) {
            e.printStackTrace();
            return null;
        }
    }

    public Object getBeanByName(String name) {
        BeanManager bm = getBeanManager();
        Bean bean = bm.getBeans(name).iterator().next();
        CreationalContext ctx = bm.createCreationalContext(bean);
        return bm.getReference(bean, bean.getClass(), ctx);
    }

    @PrePersist
    @PreUpdate
    public void onPreInsertOrUpdate(MyEntity entity) {
        User loggedInUser = (User) getBeanByName("loggedInUser");
        entity.setUpdatedUser(loggedInUser);
        entity.setUpdatedTimestamp(new Date());
    }
}

ユーザーは、セッションスコープで次のように管理されます。

@SessionScoped
public class UserManager implements Serializable {

    private User loggedInUser;

    @Produces
    @Named("loggedInUser")
    public User getLoggedInUser() {
        return loggedInUser;
    }

    // Set the logged in user after successfully login action
}

このアプローチに注意を払うべき不利な点やポイントがあるかどうか知りたいです。パフォーマンススループット?複数のログインユーザーが自分のスコープで同時にエンティティを更新している場合はどうなりますか?
Hibernate JPA 2.0
Seam Weld CDI
Glassfish 3.1.2

4

1 に答える 1

4

あなたのアプローチは正しいです。

パフォーマンスのスループット?

私見は心配する必要はありません-JPA 2.1は同等のメカニズムを使用します。ただし、安全のために現実的なテストを作成するようにしてください。

複数のログイン ユーザーがそれぞれのスコープで同時にエンティティを更新するとどうなりますか?

すべての (依存スコープではない) Bean 参照は内部的にプロキシされます。基盤となる CDI 実装は、正しい解像度を保証する必要があります。

于 2012-05-26T12:53:55.003 に答える