oracle <id name="DBId" type="java.lang.Integer" column="DBId">
<generator class="sequence">
        <param name="sequence">CHANNEL_SEQUENCE</param>
                  </generator>
         </id>

解决方案 »

  1.   

    sql server <id name="id">
    <generator class="identity"/>
    </id>
      

  2.   

    你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
    写成两个文件?能否只用一个文件?
      

  3.   

    sql server中不用identiety. 用自己的java算法维护id列。
      

  4.   

    你用什么数据库就用哪种写法更正一下:sqlserver中我写的那个是数据库自动增加的,
    不是你 表的id列在sql server中由java代码写算法维护
      

  5.   

    你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
    写成两个文件?能否只用一个文件?
      

  6.   

    取决于你最终采用的数据库,我想你不可能同时用两个数据库吧?
    你用oracle映射文件就只有sequence那个
    你用sqlserver的话映射文件就只有你自己写的那个
    没有两种映射,除非你是两套系统用不同的数据库一句话,用oracle就用sequence那个,用sqlserver就用你自己写的那个。不要想着两个都用
      

  7.   

    系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样
    ----------------------------------------------------------
    数据库都不同,影射文件肯定不同写成两个文件?能否只用一个文件?
    ----------------------------------
    如果你是两套系统用了不同数据库的话,那还是一个系统里只有一种影射文件对不同数据库而言没有通用的影射文件
      

  8.   

    系统会发布到很多地方,这些地方有的是oracle的库,有的是sql server的库.这些.hbm.xml文件我想就写一套,不搞两套,实在不行我在程序里判断一下数据库是什么类型,然后做特殊处理.
    可是怎么得到hibernate当前连接是什么类型的数据库???
      

  9.   

    干脆都用java实现,不用序列,不就行了,何苦
      

  10.   

    同一个表,字段也一样,就是表的id字段在sql server 中是int(非identiey),在oracle是number(使用sequence)
      

  11.   

    以下做法仅供参考(数据同步未考虑)
    web.xml中<resource-ref>
        <description>user1 datasource</description>
        <res-ref-name>jdbc/user</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <init-param driver-name="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
        <init-param url="jdbc:microsoft:sqlserver://192.168.0.1:1433;DatabaseName=count;SelectMethod=cursor"/>
        <init-param user="sa"/>
        <init-param password="123456"/>
        <init-param max-connections="500"/>
        <init-param max-idle-time="30"/>
        <res-auth>Container</res-auth>
    </resource-ref><resource-ref>
        <description>user2 datasource</description>
        <res-ref-name>jdbc/user</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <init-param driver-name="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
        <init-param url="jdbc:microsoft:sqlserver://192.168.0.2:1433;DatabaseName=count;SelectMethod=cursor"/>
        <init-param user="sa"/>
        <init-param password="123456"/>
        <init-param max-connections="500"/>
        <init-param max-idle-time="30"/>
        <res-auth>Container</res-auth>
    </resource-ref>
    ……-----------------------------------------------------------------------
    工厂组类SessionFactoryGroup  /**
       * 工厂组
       */
      private static HashMap factoryGroup = new HashMap();
      /**
       * 创建factory, 并存入工厂组
       * @param key 键
       * @param resource 资源名
       * @return
       */
      public static SessionFactory buildSessionFactory(String key, String resource) {
        SessionFactory factory = SessionFactoryGroup.getSessionFactory(key);
        if (factory == null) {
          try {
            factory = new Configuration()
                .configure(resource)
                .buildSessionFactory();
            factoryGroup.put(key, factory);
          }
          catch (HibernateException ex) {
            throw new RuntimeException("Exception building SessionFactory: " +
                                       ex.getMessage(), ex);
          }
        }
        return factory;
      }
      /**
       * 取得指定的工厂
       * @param key 键值
       * @return
       */
      public static SessionFactory getSessionFactory(String key) {
        Object obj = factoryGroup.get(key);
        if (obj == null) {
          return null;
        }
        else {
          return (SessionFactory) obj;
        }
      }
      /**
       * 销毁工厂组
       */
      public static void destroySessionFactories() {
        Iterator keys = factoryGroup.keySet().iterator();
        while (keys.hasNext()) {
          Object key = keys.next();
          SessionFactory factory = (SessionFactory) factoryGroup.get(key);
          try {
            factory.close();
            factory = null;
          }
          catch (HibernateException he) {
            //
          }
          factoryGroup.remove(key);
        }
      }
    -----------------------------------------------------------------------
    HibernateUtil中  /**
       * 当前线程Session
       */
      public static final ThreadLocal session = new ThreadLocal();
      public static int icount = 0;  public HibernateUtil() throws HibernateException {
      }
      /**
       * 取得并保存当前线程的Hibernate Session
       * @param resourceName 标识Resource指向
       * @return
       * @throws HibernateException
       */
      public static Session currentSession(String resourceName) throws
          HibernateException {
        HashMap h = (HashMap) session.get();
        Session s;
        if (h != null && h.get(resourceName) != null) {
          s = (Session) h.get(resourceName);
          //System.out.println("get old one");
        }
        else {
          //closeSession(resourceName);
          s = createNewSession(resourceName);
          if (null == h) {
            h = new HashMap();
          }
          h.put(resourceName, s);
          session.set(h);
          //System.out.println("get new one");
        }
        //System.out.println("current session count:" + icount);
        return s;
      }  private static Session createNewSession(String resourceName) throws
          HibernateException {
        icount++;
        return SessionFactoryGroup.getSessionFactory(resourceName).openSession();
      }  /**
       * 关闭当前线程中的hibernate Session
       * @throws HibernateException
       */
      public static void closeSession(String resourceName) throws
          HibernateException {
        //System.out.println("close session");
        HashMap h = (HashMap) session.get();
        if (h != null) {
          Session s = (Session) h.get(resourceName);
          h.remove(resourceName);
          session.set(h);
          if (s != null) {
            s.disconnect();
            s.close();
            s = null;
          }
          icount--;
        }
      }
    -----------------------------------------------------------------------