2013-05-07 50 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