エンティティがエンティティ マネージャにアクセスできるようにするこの設計を評価しています。
書籍の実体:
@Entity
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long isbn;
private String nom;
public void save() {
System.out.println("OWN PERSIST !");
**ThreadLocalEntityManager.em().persist(this);**
}
}
ブックサービス:
@Stateless
@Interceptors(EntityManagerInjector.class)
public class BookService {
public void create()
{
Book b=new Book(1,2,"3");
b.save();
}
}
EntityManagerInjector
public class EntityManagerInjector implements Serializable {
@PersistenceContext
private EntityManager em;
@AroundInvoke
public Object associate(InvocationContext ic) throws Exception {
ThreadLocalEntityManager.associateWithThread(em); //statically imported method
try {
return ic.proceed();
} finally {
ThreadLocalEntityManager.cleanupThread();
}
}
}
ThreadLocalEntityManager
public class ThreadLocalEntityManager {
private static final ThreadLocal<EntityManager> THREAD_WITH_EM = new ThreadLocal<EntityManager>();
private ThreadLocalEntityManager() {
}
public static void associateWithThread(EntityManager em) {
THREAD_WITH_EM.set(em);
}
public static EntityManager em() {
System.out.println("gettint entitymanger from thread:"+THREAD_WITH_EM.toString());
System.out.println("entitymanger id:"+THREAD_WITH_EM.get().toString());
return THREAD_WITH_EM.get();
}
public static void cleanupThread() {
THREAD_WITH_EM.remove();
}
}
いくつか質問があります:
- これは、crud サービス (create、delete、findXX) を使用しないようにするための適切な設計ですか?
- この設計により、コンテナ内で何らかの種類のランタイム実行の問題が発生する可能性がありますか?
- 宣言を static に変更することは
book.save()
、「永続化操作」へのアクセスを簡素化する良い方法です (new を避けBook().find(id)"
ますか?
ありがとう 。ps1:と Glassfish 3.1.2を使用JPA 2
していますEjb 3.1
ps2: この設計は Real World Java EE Patterns Rethinking Best Practices (Adam Bien) で見つけました。