Design patterns 实体使用实体管理器,这个设计有多好?
我正在评估允许实体访问实体管理器的设计 图书实体:Design patterns 实体使用实体管理器,这个设计有多好?,design-patterns,jakarta-ee,jpa,ejb,jpa-2.0,Design Patterns,Jakarta Ee,Jpa,Ejb,Jpa 2.0,我正在评估允许实体访问实体管理器的设计 图书实体: @Entity public class Book implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private Long isbn; private St
@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();
}
}
图书服务:
@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();
}
}
实体管理器喷射器
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();
}
}
公共类ThreadLocalEntityManager{
私有静态最终ThreadLocal线程,带有_EM=new ThreadLocal();
私有线程LocalEntityManager(){
}
与线程关联的公共静态无效(EntityManager em){
用_EM.set(EM)穿_;
}
公共静态实体管理器em(){
System.out.println(“GetInt entitymanger from thread:+thread_WITH_EM.toString());
System.out.println(“entitymanger id:+THREAD_WITH_EM.get().toString());
使用_EM.get()返回线程_;
}
公共静态void cleanupThread(){
用_EM.remove()拧_;
}
}
我有一些问题:
book.save()
声明更改为static是否是简化“持久性操作”(避免新建book().find(id)”
访问的好方法ps2:我在现实世界的JavaEE模式反思最佳实践中发现了这种设计(Adam Bien)我反对这种设计
save()
只会在这个非常特定的框架内工作,这将是ass-to-unit测试中100%的痛苦
想一想,如果你想重复使用这个bean来做一些需要XML序列化的事情,比如Web服务。现在save()
不能正常工作。持久性引擎已经可以通用地处理bean了,不要在它上面再写一层来去掉它我反对这种设计
save()
只会在这个非常特定的框架内工作,这将是ass-to-unit测试中100%的痛苦
想一想,如果你想重复使用这个bean来做一些需要XML序列化的事情,比如Web服务。现在save()
不能正常工作。持久性引擎已经可以通用地处理bean了,不要在它上面再写一层来去掉它