【问题标题】:Flex Hibernate - Setting up EntityManager and SessionFactory with Flex/Mate/ and BlazeDSFlex Hibernate - 使用 Flex/Mate/ 和 BlazeDS 设置 EntityManager 和 SessionFactory
【发布时间】:2009-09-22 01:40:51
【问题描述】:

我正在使用 Mate、Blaze DS、Tomcat 服务器创建一个 Flex 项目。所有这些似乎都在起作用。甚至我的 Hibernate 调用都可以正常工作。但是,它们似乎没有以正确的方式创建。我正在使用 java 中的以下代码块登录用户:

public AbstractUser login(String username, String password){ 
    //Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
    //SessionFactory sessionFactory= cfg.buildSessionFactory();
    SessionFactory sessionFactory;
    sessionFactory = new AnnotationConfiguration()
    .addAnnotatedClass(AbstractUser.class)
    .addAnnotatedClass(CourseSession.class)
    .addAnnotatedClass(Course.class)
    .addAnnotatedClass(Message.class)
    .addAnnotatedClass(Material.class)
    .addAnnotatedClass(TopicSession.class)
    .addAnnotatedClass(Step.class)
    .addAnnotatedClass(Section.class)
    .addAnnotatedClass(Topic.class)
    .addAnnotatedClass(Subtopic.class)
    .configure("hibernate.cfg.xml") 
    .buildSessionFactory();
    sessionFactory.openSession();

    emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);                             
    em = emf.createEntityManager(); 
    logger.debug("** username:"+username);
    logger.debug("** password:"+password);

    Query q = em.createNamedQuery("users.byUnPass");                         
    q.setParameter("username", username);   
    q.setParameter("password", password);
    AbstractUser user;

    try{
        user = (AbstractUser) q.getSingleResult(); 
    }catch(javax.persistence.NoResultException e){
        user = new AbstractUser();
    }

    return user;
}

这种方法有两个问题 1. entityManager 和 SessionFactory 都需要在第一个按钮被按下时自行初始化,造成了相当长的时间延迟,等待它全部初始化。 2.我阅读了hibernate SessionFactory的文档:

我们还推荐一个小的包装类来在静态初始化块中启动 Hibernate,称为 HibernateUtil。 您可能已经在 Hibernate 文档的其他区域中以各种形式看到过此类。

现在我有关于如何编写类的文档,但是我应该将它放在我的 flex/java 文件格式中的什么位置?目前在我的 Java 文件结构中: com 飞马座 tms- 放置第一级服务 材料 - 放置我正在使用的材料 pojo 此外,设置 SessionFactory 以使 EntityManager 快速运行是必要的 - 因为我注意到每当我有一个打开 EntityManager 然后关闭它的函数时,初始化它需要一段时间。

更普遍的问题是,如何以优化的方式设置我的 SessionFactory 和 EntityManager?

提前致谢。

托德

【问题讨论】:

    标签: hibernate tomcat flex3 blazeds


    【解决方案1】:

    你在使用Spring Framework吗?如果没有,我建议你认真考虑。

    它提供Blaze DS integration 以及HibernateJPA 集成。您将在上下文中定义所有内容,并让 Spring 为您引导它。 EntityManager 实例将直接注入您的服务/DAO。

    【讨论】:

    • 我目前没有使用弹簧。我研究了它,但我没时间研究它,而且设置起来似乎很复杂。
    • 我错过了什么吗?我尝试下载 Spring Blaze DS 集成,它引导我到一个页面下载,我单击按钮并没有任何反应。
    • 这是一个直接链接:s3.amazonaws.com/dist.springframework.org/release/FLEX/… - 似乎对我有用。我个人没有与 BlazeDS 合作过。但是 Spring 本身——虽然它确实有一点学习曲线——设置起来并不难,但提供了很多特性。一旦你使用它,你会想知道如果没有它你是怎么做的。要开始,您只需要真正了解 IOC / 应用程序上下文 (static.springsource.org/spring/docs/2.5.x/reference/beans.html) 以及 Hibernate 集成(我的答案中的链接)。
    • 是的,所以假设我还没有使用 Spring(因为学习曲线)。关于 EntityManager 和 SessionFactory 的问题有什么建议吗? java中的每个函数是否都需要打开一个EntityManager和EntityManagerFactory并在完成时关闭它?这似乎是过度使用,而不是一个好的实现。但所有的hibernate示例似乎都是这样编写代码的。
    • 您当然不应该在每次调用中都构建 SessionFactory (EntityManagerFactory) - 它们应该创建一次并重用。 Session / EntityManager 应该为每个单独的工作单元创建,这可能是一个单独的调用,也可能跨越多个调用。我提到 Spring 的原因是因为它会为你处理(大部分)这个问题;无论您现在花时间学习它,您都将节省十倍的时间,因为您不必调试您的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多