posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

改变开发方式的 hbm+rmic

Posted on 2007-12-24 13:36 G_G 阅读(1083) 评论(4)  编辑  收藏 所属分类: EJB
为了了解hbm的rmic真正的威力还有为了更近一步了解;在此特使用文本和dos命令完成这次学习。
在此读者最好先做好不使用 IDE 的准备(^_^!  文本编辑,dos编辑和运行)
阅读需要:
 java,javac,rmiregistry,rmic,ant 等命令有所涉及(只是简单使用,不会也别怕!)

可行性使用说明:
  持久层程序员成功开启rmiregistry服务,在局域网内其他使用数据的队友就只要加载
hbmBean 的映射jar和 dao接口jar后 就可以取得数据。根本感觉不到hbn使用。
优点:
1.其他队员编译classpath中不需要hbm的任何东西,跟关注自己东西。
2.强制接口规范。
3.正交编程。
4.DAO测试性能方便。
5.这还是 EJB 原理,转换容易。

缺点:
1.rmic 突破放火墙能力有限,可以换成EJB
2.大型项目注册服务器,配置繁琐,可以使用EJB3.0
 


使用:
1.jdk1.5
2.jar使用(为了用hbm)     
    jta.jar;
    asm.jar;
    commons-collections-2.1.1.jar;
    commons-logging-1.0.4.jar;
    hibernate3.jar;
    dom4j-1.6.1.jar;
    cglib-2.1.3.jar;
    antlr-2.7.5H3.jar
    MYSQL.jar
3.ant1.7(使用hbm生成 mapping;config...)
4.Middlegen-Hibernate-r5 同上
5.使用文件路径
  E:\rmi_test->
     +-src
     --hibernate3.xml
     --hibernate3_ant.properties

开始:
 1>使用ant 对 hbm  配置映射参考 :ant 项目实际 并使用 hibernate3.xml
    dos 输入 -> ant -f hibernate3.xml ddl2hbm (使用了Middlegen-Hibernate-r5)
             -> ant -f hibernate3.xml create_config (hibernate.cfg.xml建立)
    在 hibernate.cfg.xml中添加-> <mapping resource="hibernate\Liu.hbm.xml" />
    dos 输入 -> ant -f hibernate3.xml hbm2java
 
变成+-src
       |-hibernate
          |-Liu.hbm.xml
          |-Liu.java
       |-hbmConfig
          |-hibernate.cfg.xml
 2>手动建hbmHibernateSessionFactory在hbmConfig文件中(为了简单copy->myeclipes生成的)
package   hbmConfig; 
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {
@link http://hibernate.org/42.html}.
 
*/
public class HibernateSessionFactory {

    
/** 
     * Location of hibernate.cfg.xml file.
     * NOTICE: Location should be on the classpath as Hibernate uses
     * #resourceAsStream style lookup for its configuration file. That
     * is place the config file in a Java package - the default location
     * is the default Java package.<br><br>
     * Examples: <br>
     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml". 
     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code> 
     
*/
    
private static String CONFIG_FILE_LOCATION = "/hbmConfig/hibernate.cfg.xml";

    
/** Holds a single instance of Session */
    
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

    
/** The single instance of hibernate configuration */
    
private static final Configuration cfg = new Configuration();

    
/** The single instance of hibernate SessionFactory */
    
private static org.hibernate.SessionFactory sessionFactory;

    
/**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  
@return Session
     *  
@throws HibernateException
     
*/
    
public static Session currentSession() throws HibernateException {
        Session session 
= (Session) threadLocal.get();

        
if (session == null) {
            
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.openSession();
            threadLocal.set(session);
        }

        
return session;
    }

    
/**
     *  Close the single hibernate session instance.
     *
     *  
@throws HibernateException
     
*/
    
public static void closeSession() throws HibernateException {
        Session session 
= (Session) threadLocal.get();
        threadLocal.set(
null);

        
if (session != null) {
            session.close();
        }
    }

    
/**
     * Default constructor.
     
*/
    
private HibernateSessionFactory() {
    }

}

dos中编译->
E:\rmi_test\src>javac -cp   .;D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\hibernate3.jar   
hbmConfig/*.java


3>DAO实现
接口->
package rmic;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IHello extends Remote {
    
public String sayHello(String id) throws RemoteException;
}

实现类->
package rmic;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
//取消显示指定的编译器警告!
//参考 : http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/SuppressWarnings.html
@SuppressWarnings("serial")
public class Hello extends UnicastRemoteObject implements IHello {
    
public Hello() throws RemoteException {
        
super();
    }
    
    
public void rebind(String name) { 
        
try {
            Naming.rebind(name,
this);
            System.out.println(
"Server is running");
        } 
catch(Exception e) {
            e.printStackTrace();
        }
    }
    
public String sayHello(String id) throws RemoteException {
        System.out.println(
"run Server.");
        
    org.hibernate.Session session 
= hbmConfig.HibernateSessionFactory.currentSession();
    org.hibernate.Query qu 
= session.createQuery("from Liu lt where lt.id=:id");
    hibernate.Liu ll 
= (hibernate.Liu)qu.setString("id"
,id).uniqueResult();
    hbmConfig.HibernateSessionFactory.closeSession();


        
return "Hello "+ll.getName()+" This is processed by RMI";
    }

}

dos编译->
E:\rmi_test\src>javac -cp .;D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.
2\hibernate3.jar  rmic/*.java

4>java注册机开启
E:\rmi_test\src>rmiregistry 1099

5> 本例简单服务器开启
package start;

import java.rmi.RMISecurityManager;
import rmic.Hello ;

public class Start {

    
public static void main(String[] args) {
        
try {
            
//System.setSecurityManager(new RMISecurityManager());
            new Hello().rebind("RMI/Mclaren");
        } 
catch(Exception e) {
            e.printStackTrace();
        }
    }
}

dos编译->E:\rmi_test\src>javac  start/*.java
运行->
java -classpath .;D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\jta.jar;
D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\asm.jar;
D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\commons-collections-2.1.1.jar;
D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\commons-logging-1.0.4.jar;
D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\hibernate3.jar;
D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\dom4j-1.6.1.jar;
E:\lib\MYSQL.JAR;D:\hbn\hibernate-3.2\hibernate-3.2.5.ga\hibernate-3.2\lib\cglib-2.1.3.jar;
E:\and\ant\bin\antlr-2.7.5H3.jar
  start.Start


6>客户端
 得到存根Hello_Stub.class-> E:\rmi_test\src>rmic rmic.Hello
 换个地方:c:\\TT 并copy rmic中的IHello.class和Hello_Stub.class连同目录rmic一同copy
package client;

import java.rmi.Naming;
import rmic.IHello;

public final class Client {
    
public static void main(String[] args) {
        System.out.println(
"client.");
        
try {
            IHello hello 
= (IHello)Naming.lookup("rmi://localhost:1099/RMI/Mclaren");
            System.out.println(hello.sayHello(
"1"));
        } 
catch(Exception e) {
            e.printStackTrace();
        }
    }

}

 dos编译-> C:\TT>javac -d . Client.java
 C:\TT>java client.Client
 client....
 Hello gg This is processed by RMI (gg就是数据 成功! )

mysql> select * from liu;
+----+------+-----+
| id | name | avg |
+----+------+-----+
|  1 | gg   |  24 |
+----+------+-----+









评论

# re: 改变开发方式的 hbm+rmic  回复  更多评论   

2007-12-24 15:26 by 隔叶黄莺
没看到多少内容以及有意义的东西,直接就是 RMI 了,至于服务端爱做什么事情是服务端的事情了。

# re: 改变开发方式的 hbm+rmic  回复  更多评论   

2007-12-24 18:30 by G_G
对于刚接触 EJB 的我 来说
这原理的 使用 还是 很吸引 我的

@隔叶黄莺
我们位置不同吧!你可能已经一大牛了
呵呵

# re: 改变开发方式的 hbm+rmic  回复  更多评论   

2007-12-25 13:05 by 隔叶黄莺
EJB 的远程接口的方式调用实际确实是用的 RMI
而且在程序中启动RMI注册服务比单独命令启动要方便些。

# re: 改变开发方式的 hbm+rmic[未登录]  回复  更多评论   

2007-12-26 09:23 by G_G
@隔叶黄莺
谢谢提醒

只有注册用户登录后才能发表评论。


网站导航: