JPA 2.0はEntityListener(JPA 2.1)への注入をサポートしていないため、JNDIルックアップを使用してBeanManager
を取得し、ログインしたユーザーを取得することにしました。私はこれに似たEntityListener
定義:としてEntityListenersでのCDI注入
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
シーム溶接CDI
Glassfishの3.1.2