讨论一下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;
}
}
}
讨论一下hibernate如何动态注册一个动态生成的实体类的更多相关文章
- 使用T4模板动态生成NPoco实体类
这是一个妥妥的NPoco类,这是我们在工作开发中,手动去写这个实体类,属实非常心累,字段少无所谓一次两次,数量多了,字段多了,就心态裂开
- 用node.js给C#写一个数据表的实体类生成工具
虽然微软提供了T4模板,但是我感觉非常难用.哪儿比得上直接用脚本来写模板来的爽. 因为要给一个老项目做周边的工具,需要连接到数据库. 我习惯性用EntityFrameworkCore来做,因为毕竟从出 ...
- hibernate中先建表还是先建实体类
在实际工作中往往是先建表然后再生成类原因:建好数据库表之后往往要对数据表进行一些优化,比如说建索引,比如说建中间表,比如建视图.如果先建类的话这些优化是无法生成的
- MyEclipse自动生成hibernate实体类和配置文件攻略
步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右 ...
- Android只能动态注册的广播Action
只能动态注册的广播(部分): android.intent.action.SCREEN_ON android.intent.action.SCREEN_OFF android.intent.actio ...
- [Oracle] Listener的动态注册
在有Oracle Listener的动态注册之前,采用的是静态注册,所谓静态注册是指Oracle实例在启动时,读取listener.ora里的配置,然后注册到Listener,它主要有两个缺点: 1. ...
- Android 动态注册JNI函数
1.JNI函数注册方式 在Android开发中,由于种种原因我们需要调用C/C++代码,在这个时候我们就需要使用jni了, jni在使用时要对定义的函数进行注册,这样java才能通过native关键字 ...
- Android深入理解JNI(一)JNI原理与静态、动态注册
前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...
- Oracle监听的静态注册和动态注册
静态注册:通过解析listene.ora文件 动态注册:由PMON进程动态注册至监听中 在没有listener.ora配置文件的情况下,如果启动监听,则监听为动态注册.用图形化netca创建的监听,默 ...
随机推荐
- zookeeper源码分析(一) 工作原理
来自:http://www.codedump.info/?p=207 阅读zookeeper代码一段时间(注:是很长一段时间,断断续续得有半年了吧?)之后,我要开始将一些积累下来的东西写下来了,鉴于我 ...
- suse 不能远程登录
公司部分机器新装了suse企业版12,远程登录不成功,解决方法如下: 1.关闭防火墙 chkconfig --level SuSEfirewall2_init off 2.配置sshd 3.重启ssh ...
- thinkphp几个表的数据合并,并用数组分页
控制器: //金币扣除 public function jbkc(){ $map['UG_dataType']= 'xtkc'; $list1 = M ( 'userget' )->where ...
- Laravel系列2入门使用
最好的教程是官方文档! homestead安装好,就可以使用了. 安装Laravel composer create-project --prefer-dist laravel/laravel blo ...
- Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- Android 编程下的自定义 xmlns
什么是 xmlns xmlns是 XML Namespaces 的缩写,中文名称是 XML命名空间. xmlns 使用规则 xmlns:namespace-prefix="namespace ...
- SpringHttpInvoker解析2-服务端实现
主要的配置文件 <!-- 在Spring的httpInvoker服务 --> <bean id="httpInvokerUserService" class=&q ...
- express-18 路由
简介 路由是网站或Web服务中最重要的一个方面:路由是将请求(由URL和HTTP方法指定)路由到处理它们的代码去的一种机制. 路由过去是基于文件的,这很简单,但不灵活. IA 是指内容的概念性组织.在 ...
- express-11 表单处理(2)
处理AJAX表单 用Express处理AJAX表单非常简单:甚至可以使用相同的处理程序来处理AJAX请求和常规的浏览器回退. HTML文件 (/views/newsletter.handlebars) ...
- 豆制品厂开车超市送货智能手持PDA POS打票机-手持票据打印机
豆制品厂开车拉着豆腐到某一个超市送货,到达后秤出斤数后就用票据打印机开单 能直接开单,单子一式两份,一张给客户一张留底,到月底时客户要根据客户的量返点的,单子统计.能现场开单,单子上显示哪个超市,豆制 ...