讨论一下hibernate如何动态注册一个动态生成的实体类(原)

  如何动态生成实体类请参考这篇博文:http://www.cnblogs.com/anai/p/4269858.html

  下面说说得到实体类后,如何能使用hibernate的接口来进行数据访问。

  我们都知道,hibernate是在web容器启动的时候根据相关配置信息,扫描class文件,然后注册到SessionFactory中。通过getAllClassMetadata()可以得到已经注册过的实体类的元信息。那么如果是在容器启动已经完成后,程序正常运行期间产生的类,显然是不能直接使用hibernate的接口的,因为hibernate还不认识这个新创建的类呢。那么如何在这个阶段让它们认识并建立关系呢,思路很简单,就是注册呗,但是这里有个问题,我们不能使用原来的sessionFactory了,会导致事务安全的问题,而且hibernate也建议sessionFactory一旦创建好了,就不要对其做修改,所以即使configration的内容变化了,之前就创建好的sessionFactory也不会受到影响。好了下面上代码:

代码中 SpringContextUtil.getBean("&sessionFactory") 的&符的含义,可以参考这篇博文:http://www.cnblogs.com/anai/p/4258934.html

public class myDao{
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    private List<SessionFactory> sessionFactoryList = new ArrayList<SessionFactory>();

    /******************** 以下 方法只适用于对象是动态加载进JVM的情况******************************/
    /**
     * 获取Session工厂
     * 如果指定的model是动态加载到JVM中的,
     * 那么就更新当前的configuration,
     * 并重新创建一个Session工厂(因为Session工厂是全局单例的,所以创建好之后最好不要改动,容易出现事务安全问题),
     * 以便能为该对象执行数据库访问操作
     * 该方法如果频繁使用,会增加系统开销
     * @param entityClass
     * @return
     */
    private SessionFactory obtainSessionFactory(Class<?> entityClass){
        Map<String,ClassMetadata> map = sessionFactory.getAllClassMetadata();
        Set<String> set = map.keySet();
        if(!set.contains(entityClass.getName())){
            for(SessionFactory factory : sessionFactoryList){
                Set<String> existSet = factory.getAllClassMetadata().keySet();
                if(existSet.contains(entityClass.getName())){//该sessionFactory包含了此实体,就用该SessionFactory
                    return factory;
                }
            }
            LocalSessionFactoryBean localSessionFactoryBean = SpringContextUtil.getBean("&sessionFactory");
            Configuration configuration = localSessionFactoryBean.getConfiguration();
            synchronized(configuration){//避免并发操作导致configuration重复添加相同的entityClass
                if(configuration.getClassMapping(entityClass.getName())==null){
                    configuration.addAnnotatedClass(entityClass);
                }
            }
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            SessionFactory newSessionFactory = configuration.buildSessionFactory(serviceRegistry);
            sessionFactoryList.add(newSessionFactory);
            return newSessionFactory;
        }else{
            return sessionFactory;
        }
    }
}

时间: 2024-07-30 21:59:26

讨论一下hibernate如何动态注册一个动态生成的实体类(原)的相关文章

MyEclipse中hibernate通过数据库逆向生成java实体类

1.点击window->show view->DB Browser,然后出现如下窗口 右键空白处选择New,弹出如下窗口: 先点击Add JARs按钮,选择相应数据库的JDBC driver(因为我用的是MySQL,所以选择的是之前已经下好的JDBC driver),添加完JDBC driver后.然后选择Driver template,Driver name(任意填写),Connection URL.数据库用户名.数据库登录密码,然后点击点击Test Driver(测试一下数据库是否连接成功

动态调用web服务,当有实体类的时候 (只用于一个)

public class CCBWebSeviceHelper { public static int rowCount = 0; /// < summary> /// 动态调用web服务,当有实体类的时候 (只用于一个) /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名<

MyEclipse自动生成hibernate实体类和配置文件攻略

步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右键新建一个数据库填写数据库信息,包括连接方式,用户名,密码,和jdbc的配置一样,注意将oracle的jar包导进来 步骤3:数据库连接已经出现,我们可以连接上数据库了 步骤4:这时候我们回过头,新建一个java或javaEE项目,名字随便取,然后右键该项目,选择Myeclipse---add hi

Hibernate框架 —— 实体类的自动生成

一: hibernate框架 框架在一定程度上可以理解为一个半成品. Hibernate框架是对数据库进行操作,完成数据持久化得重任. 二: 配置 使用hibernate 需要先下载hibernate.如果要下载最新版的可以去官网下载,而对于历史版本,官网中好像很难找到,不过以下地址可是试试的哦! -> 3.0及以上版本 ->4.0及以上版本 不过在下使用的是3.3.2版本的.另外再说说各版本的意思:    rc 版--发布候选版,表示可能有bug,内容不会有很大的变动    ga 版--稳定

hibernate通过数据库表反向生成实体类

步骤一: window-->open Perspective-->MyEclipse Java Persistence 进行了上面的 操作后会出现一个视图DB Brower:MyEclipse Derby, 点击右键新建new一个在出现的面板Database Driver中,Driver template中选择Oracle(ThinDriver)这里以oracle软件为例,如果是mysql就选mysql的 driver name可以随意取,Connection URL就写平常的JDBC中的 U

MyEclipse Hibernate反向工程生成实体类

不废话,直接上步骤 step1.Window -> Open Perspective -> MyEclipse Database Explorer 到DB Broswer界面 step2.右键 -> New,新建一个数据库连接 step3.创建一个java项目 step4.给项目添加Hibernate Capabilities 项目 -> 右键 -> MyEclipse -> Add Hibernate Capabilities Add Hibernate Capabi

Hibernate自动生成配置文件和实体类

用Hibernate自动生成,实体类和配置文件步骤: 窗口--Perspective--打开试图--Hibernate(点击打开如下图所示) 右键:AddConfigurRation:(如下图所示) 以上只是配置好了,数据库的链接和hibernate.cfg.xml文件的生成. 下面演示自动生成实体类和实体类所对应的hbm.xml文件: 点击确定配置完成了

自己动手写RPC框架到dubbo的服务动态注册,服务路由,负载均衡功能实现

RPC即远程过程调用,它的实现方式有很多,比如webservice等.框架调多了,烦了,没激情了,我们就该问自己,这些框架的作用到底是什么,来找回当初的激情. 一般来说,我们写的系统就是一个单机系统,一个web服务器一个数据库服务,但是当这单台服务器的处理能力受硬件成本的限制,是不能无限的提升处理性能的.这个时候我们使用RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了提升. RPC的实现包括客户端和服务端,即服务的调用方和服务的提供方.服务调用方发送rpc请求

RPC原来就是socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用. RPC即远程过程调用,它的实现方式有很多,比如webservice等.框架调多了,烦了,没激情了,我们就该问自己,这些框架的作用到底是什么,来找回当初的激情. 一般来说,我们写的系统就是一个单机系统,一个web服务器一个数据库服务,但是当这单台服务器的处理能力受硬件成本的限制,是不能无限的提升处理性能的.这个时候我们使用RPC将原来的本地调