2013-05-07 49 views
4

我有通過JNDI數據源連接到數據庫的hibernate。使用JNDI註冊MySQL數據源進行休眠

我的目的:使用JNDI的註冊表數據源來測試DAO層。

休眠配置

<hibernate-configuration> 
    <session-factory name="MySessionFactory"> 
     <property name="hibernate.connection.datasource">java:jdbc/MysqlMyDS</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<!-- mappings .... -> 
</hibernate-configuration> 

在測試類獲取會話工廠:

Configuration cgf = new Configuration().configure("/META-INF/hibernate.cfg.xml"); 
SessionFactory iceleadsSessionFactory = cgf.buildSessionFactory(); 

其結果:

16:04:37,753 ERROR DatasourceConnectionProvider:78 - Could not find datasource: java:jdbc/MysqlIceleadsDS 
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 

要註冊JNOI我使用示例(http://www.roseindia.net/tutorial/java/jdbc/registeringthedatasourcewithjndi.html

import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.util.Properties; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.sql.ConnectionPoolDataSource; 

import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; 
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; 

public class RegisteringJNDIWithDataSource { 
     private static void startRegistry() throws RemoteException { 
       System.out.println(LocateRegistry.getRegistry()); 
       LocateRegistry.createRegistry(1059); 
       System.out.println("RMI registry Stared."); 
     } 

     private static InitialContext createInitialContextContext() 
         throws NamingException { 
       Properties properties = new Properties(); 
       properties.put(Context.INITIAL_CONTEXT_FACTORY, 
           "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
       properties.put(Context.PROVIDER_URL, "rmi://localhost:1059"); 
       InitialContext initialContextcontext = new InitialContext(properties); 
       return initialContextcontext; 
     } 

     public static void main(String args[]) { 
       try { 
         startRegistry(); 
         ConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
         ((MysqlDataSource) dataSource).setUser("root"); 
         ((MysqlDataSource) dataSource).setPassword("root"); 
         ((MysqlDataSource) dataSource).setServerName("192.168.10.13"); 
         ((MysqlDataSource) dataSource).setPort(3306); 
         ((MysqlDataSource) dataSource).setDatabaseName("student"); 

         InitialContext context = createInitialContextContext(); 
         context.rebind("Source", dataSource); 

       } catch (Exception e) { 
         System.out.println(e.getMessage()); 
       } 
     } 
} 

請建議解決方案。謝謝!

+0

你爲什麼不改變'dataSource'爲'MysqlDataSource'的類型?那麼你可以擺脫這5個陣容。 – 2013-05-07 13:09:48

+0

我試圖使用DataSource(而不是MysqlDataSource),但結果相同。 hibernate無法找到任何數據源的問題 – Tioma 2013-05-07 13:27:33

+0

您是否爲測試環境設置了'jndi.properties'? http://docs.oracle.com/javase/jndi/tutorial/beyond/env/source.html – user1516873 2013-05-07 13:42:56

回答

2

如果您正確設置jndi.properties,您的代碼將可以正常工作。這個文件應該在classpath中。

這裏工作示例:

服務器:

public static void main(String[] args) throws Exception{ 
     LocateRegistry.createRegistry(1099); 
     ConnectionPoolDataSource dataSource = createDataSource("root", ""); 

     InitialContext context = createContext(); 
     context.bind("MysqlMyDS", dataSource); 
     System.out.println("context created!"); 

    } 

    private static InitialContext createContext() throws NamingException { 
     Properties env = new Properties(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
     env.put(Context.PROVIDER_URL, "rmi://localhost:1099"); 
     InitialContext context = new InitialContext(env); 
     return context; 
    } 

    private static ConnectionPoolDataSource createDataSource(String username, String password) { 
     MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
     dataSource.setUser(username); 
     dataSource.setPassword(password); 
     dataSource.setServerName("localhost"); 
     dataSource.setPort(3306); 
     dataSource.setDatabaseName("test"); 
     return dataSource; 
    } 

客戶端:

的hibernate.cfg.xml注:數據源JNDI名稱應該是完全按照您的context.bind()

設置
<?xml version='1.0' encoding='utf-8'?> 
     <!DOCTYPE hibernate-configuration PUBLIC 
       "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.datasource">MysqlMyDS</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
</session-factory> 
</hibernate-configuration> 

jndi.properties(如果你想,你可以設置它在與-D選項代碼或)

java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory 
java.naming.provider.url=rmi://localhost:1099 

單元測試

public class TestClient { 
    @Test 
    public void testCfg() throws Exception { 
     Configuration cgf = new Configuration().configure("/hibernate.cfg.xml"); 
     cgf.buildSessionFactory(); 
    } 
} 
+1

非常感謝,它現在正常工作!你是我的上帝:) – Tioma 2013-05-08 06:59:50