Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 实体使用实体管理器,这个设计有多好?_Design Patterns_Jakarta Ee_Jpa_Ejb_Jpa 2.0 - Fatal编程技术网

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()拧_;
}
}
我有一些问题:

  • 这是避免使用crud服务(创建、删除、findXX)的好设计吗
  • 这种设计是否会在系统中产生任何类型的运行时执行问题 集装箱
  • book.save()
    声明更改为static是否是简化“持久性操作”(避免新建
    book().find(id)”
    访问的好方法
  • 谢谢。 ps1:我正在使用JPA2、EJB3.1和Glassfish 3.1.2


    ps2:我在现实世界的JavaEE模式反思最佳实践中发现了这种设计(Adam Bien)

    我反对这种设计

  • 大多数应用服务器不喜欢你修改线程

    AppServer为处理请求做了大量近乎魔术的线程管理,强烈建议您甚至不要在JavaEE中创建线程

  • 实体管理器是暂时的东西

    EM应该只在事务持续的时间内存在。在这种情况下,看起来EM可以被传递到运行在同一容器中的不同应用程序中。这会让调试变得非常有趣

    想象一下,如果您从BookService调用不同的EJB,它会将EM设置为另一个EJB的EM。如果您有两个持久性单元,这将是一个巨大的问题

  • 不能延期

    这个系统中的任何新EJB都必须知道这种处理EMs的有趣方式。如果您是编写它们的人,这没关系,但是外部提供的EJB呢

  • 缺乏凝聚力

    EJB是控制/定义事务的地方。为什么我们要将接口推出JPA bean?
    save()
    只会在这个非常特定的框架内工作,这将是ass-to-unit测试中100%的痛苦

    想一想,如果你想重复使用这个bean来做一些需要XML序列化的事情,比如Web服务。现在
    save()
    不能正常工作。持久性引擎已经可以通用地处理bean了,不要在它上面再写一层来去掉它


  • 我反对这种设计

  • 大多数应用服务器不喜欢你修改线程

    AppServer为处理请求做了大量近乎魔术的线程管理,强烈建议您甚至不要在JavaEE中创建线程

  • 实体管理器是暂时的东西

    EM应该只在事务持续的时间内存在。在这种情况下,看起来EM可以被传递到运行在同一容器中的不同应用程序中。这会让调试变得非常有趣

    想象一下,如果您从BookService调用不同的EJB,它会将EM设置为另一个EJB的EM。如果您有两个持久性单元,这将是一个巨大的问题

  • 不能延期

    这个系统中的任何新EJB都必须知道这种处理EMs的有趣方式。如果您是编写它们的人,这没关系,但是外部提供的EJB呢

  • 缺乏凝聚力

    EJB是控制/定义事务的地方。为什么我们要将接口推出JPA bean?
    save()
    只会在这个非常特定的框架内工作,这将是ass-to-unit测试中100%的痛苦

    想一想,如果你想重复使用这个bean来做一些需要XML序列化的事情,比如Web服务。现在
    save()
    不能正常工作。持久性引擎已经可以通用地处理bean了,不要在它上面再写一层来去掉它