以前搞C++,开发模式和思维方式感觉不能用在Web开发里面。在我的测试project中,使用spring + hibernate。我想创建一个Hibernate的SessionFactory,我只想创建它一次,希望能保存它,然后到处使用;或者生成一个全局的applicationContext,供各个DAO从xml中创建bean对象,供整个应用程序使用,但一直不知道如何实现。另外,哪些高人能否告知,如何在Hibernate中使用oracle的Sequence?我看到generator可以指定为sequense,但配置文件中配置了,我的oracle数据库中那么多sequense,它用哪个呢?我在什么地方告知hibernate这个表用这个sequense,那个表用那个sequeense呢?初学java的web开发,感觉里面东西太多了。开源的技术也多,一头雾水,我前段时间一直觉得直接用JDBC最直接和直观,干嘛整个hibernate,还这么麻烦?现在对它又稍稍接受了点了。但目前真感觉自己在被这些这么多的技术拖累。也希望好心人指指路!

解决方案 »

  1.   

    把他申明为静态的不就好了```每次创建session时做一次判断MyEclipse里自动生成是这样的``public class HibernateSessionFactory {
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static final ThreadLocal threadLocal = new ThreadLocal();    private static final Configuration cfg = new Configuration();    private static org.hibernate.SessionFactory sessionFactory;
        public static Session currentSession() throws HibernateException {
            Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) {
    if (sessionFactory == null) {
    try {
    cfg.configure(CONFIG_FILE_LOCATION);
    sessionFactory = cfg.buildSessionFactory();
    } catch (Exception e) {
    System.err
    .println("%%%% Error Creating SessionFactory %%%%");
    e.printStackTrace();
    }
    }
    session = (sessionFactory != null) ? sessionFactory.openSession()
    : null;
    threadLocal.set(session);
    }        return session;
        }    public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);        if (session != null) {
                session.close();
            }
        }
        private HibernateSessionFactory() {
        }}那啥````ORACLE我没用Hibernate连过``不知道了``
      

  2.   

    谢谢lwy8802(Victim)的解答。我通过看例子和网上的文章。通过静态类来实现我需要的情况应该是可以的。但,静态类其实是对我需要全局化的这个对象的一个包装,把它放在静态类里面。为了做到线程安全还可以使用ThreadLocal。希望有兄弟再帮我解答一下hibernate连oracle的sequense的使用方法。
      

  3.   

    用单例模式可实现你的要求.. ( 详细就不讲了,请上网搜索相关文章,很简单)But , 似乎 SessionFactory 本身已经实现了楼主的要求,不必多费心力这么去做.JAVA 好玩就在于他面广,一辈子都没可能学的完.
      

  4.   

    唉,我也有和楼主一样的迷惑,感觉需要学习的太多了,我现在又在看Ajax,相关的知识也很多
      

  5.   

    to iiitom()
    感谢你的解答。但SessionFactory它自身里面就保存了Session。其实供我们使用的是Session。换句话说,那么我想自己来创建一个Session,并且让它持续存在,直到我的应用服务器down下或者我控制它释放。你说得的单例模式,我网上搜了下。它仅仅是个设计模式的一种。我希望知道在spring或者说普遍的web应用中应该如何来实现呢?to BBXXL()
    其实java并不是有多么高深,我觉得学java一定就是要吃透java核心的东西,比如它的反射机制、类型系统……(我知道得很少哈),其它的技术,我发现都仅仅是些工具和延伸而已,不用这些技术,你一样能做很多事情,只不过很麻烦。为什么C++里面就没有这么好的东西呢?象spring啊、hibernate呀,他们的设计思想都很好,关键就是C++的类型很弱,太靠近机器本身了,如果要实现起来太复杂了。我一直感叹java的类型系统和反射机制,所有我目前看到的这些工具(hibernate, spring)这些都是基于了这些java的语言特性。否则啥子都没得。另外ajax其实跟java应该没有太大干系。ajax好像也可以用在.net的Web应用程序里面吧(不敢肯定哈)。
      

  6.   

    我用postgresql,Sequence应该跟oracle差不多。给你参考一下。
    <?xml version="1.0"?><!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" ><hibernate-mapping package="cn.net.fornet.cms.admin">

    <class name="User" table="tb_admin_user" dynamic-insert="false" dynamic-update="false">
            <cache usage="read-write"></cache>
            <id name="id" type="long">
    <generator class="sequence">
                    <param name="sequence">tb_admin_user_id_seq</param>
                </generator>
    </id>
    <property name="name" column="name" type="string" not-null="true"/>
    <property name="password" column="password" type="string" not-null="true"/>
        </class>

    </hibernate-mapping>
      

  7.   

    顶一个
    我也是刚从c#转过来的
    唉,还要我三个礼拜内就把原来的项目用sevlet+ajax重新实现一遍
      

  8.   

    普便的方法是,创造一个对象,然后把它放到context中去...
    context.serAttribute()..
    这样的对象会在站台的生存期一直存在。