代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

javax.naming.Reference与org.hibernate.SessionFactory不兼容

  •  -1
  • Mahmoud Saleh  · 技术社区  · 6 年前

    我正在使用 在WebSphere8.5.5.4上。

    休眠配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                             "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory name="mySessionFactory">
    
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.connection.datasource">MyDS</property>
        <property name="hibernate.default_schema">dbo</property>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
        <property name="hibernate.connection.autocommit">false</property>
        <property name="hibernate.jndi.class">com.ibm.websphere.naming.WsnInitialContextFactory</property>
    
    
        <property name="hibernate.jndi.url">corbaloc::myapp-prod-fnicn1.my.com:2809,:myapp-prod-FNICN2.my.com:2809,:myapp-prod-fnicn1.my.com:2811,:myapp-prod-FNICN2.my.com:2811,:myapp-prod-fnicn1.my.com:2812,:myapp-prod-FNICN2.my.com:2812</property> 
    
        <property name="hibernate.transaction.auto_close_session">true</property>
        <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
        <property name="hibernate.transaction.flush_before_completion">true</property>
    
        <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>
    
        <property name="hibernate.current_session_context_class">jta</property>
        <property name="jta.UserTransaction">java:comp/UserTransaction</property>
    
      <mapping resource="gov/mci/efada/entities/User.hbm.xml"/>
    
     </session-factory>
    </hibernate-configuration>
    

    如何配置休眠:

    Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                    .buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    

    sessionFactory = (SessionFactory) new InitialContext().lookup("mySessionFactory");
    

    有时,SessionFactory的查找会引发:

    javax.naming.Reference incompatible with org.hibernate.SessionFactory
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   halfer    6 年前

    我通过创建一个singleton类解决了这个问题,如下所示:

    public class EntityHome {
    
        protected static final Log log = LogFactory.getLog(EntityHome.class);
        protected SessionFactory sessionFactory;
        private static ServiceRegistry serviceRegistry;
        private static EntityHome entityHome;
    
        public static EntityHome getInstance() {
            if (entityHome == null) {
                try {
                    entityHome = new EntityHome();
                } catch (Exception e) {
                    AppLogger.log("########### unable to configure hibernate,exception is: " + e.getMessage());
                    entityHome = null;
                }
            }
            return entityHome;
        }
    
        private EntityHome() throws Exception {
            try {
                configureHibernate();
            } catch (Exception e) {
                throw e;
            }
        }
    
        private void configureHibernate() throws HibernateException {
    
            Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                    .buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        }
    
        public SessionFactory getSessionFactory() throws NamingException {
            if (sessionFactory == null || sessionFactory.isClosed()) {
                configureHibernate();
            }
            return sessionFactory;
        }
    
        public UserTransaction getTransaction() {
    
            UserTransaction transaction = null;
    
            try {
                Object o = new InitialContext().lookup("java:comp/UserTransaction");
                transaction = (UserTransaction) o;
                return transaction;
            } catch (Exception e) {
                throw new IllegalStateException("Could not locate java:comp/UserTransaction in JNDI");
            }
        }
    
        public static <T> List<T> fromSetToList(Set<T> set) {
            List<T> list = new ArrayList<T>();
            for (T o : set) {
                list.add(o);
            }
            return list;
        }
    }
    

    public class CarCategoryHome {
    
            private final SessionFactory sessionFactory = getSessionFactory();
    
            protected SessionFactory getSessionFactory() {
                try {
                    return EntityHome.getInstance().getSessionFactory();
                } catch (NamingException e) {
                    AppLogger.Log(e);
                    return null;
                }
            }
    
            public CarCategory findById(Integer id) {
                try {
                    CarCategory instance = (CarCategory) sessionFactory.getCurrentSession()
                            .get("com.myapp.data.CarCategory", id);
                    return instance;
                } catch (RuntimeException re) {
                    throw re;
                }
            }
    
        }