然后就是准备模板了,首先声明
Html代码
-
<?xml version="1.0" encoding="utf-8"?>
-
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
<hibernate-mapping>
-
<class name="${entity.className}" table="${entity.tableName}">
-
<#if entity.properties?exists>
-
<#list entity.properties as property>
-
<#if property.primary>
-
<id name="${property.name}" type="${property.type}">
-
<#else>
-
<property name="${property.name}" type="${property.type}">
-
</#if>
-
<#if property.type=="java.lang.String">
-
<column name="${property.field?upper_case}" <#if property.length?exists>length="${property.length}"</#if>></column>
-
<#elseif property.type=="java.util.Date">
-
<column name="${property.field?upper_case}" length=7></column>
-
<#elseif property.type=="java.lang.Long" || property.type=="java.lang.Integer"
-
|| property.type=="java.lang.Short">
-
<column name="${property.field?upper_case}" <#if property.length?exists>precision="${property.length}"</#if> scale="0"></column>
-
</#if>
-
<#if property.primary==true>
-
<#if property.sequence?exists>
-
<generator class="sequence">
-
<param name="sequence">${property.sequence}</param>
-
</generator>
-
</#if>
-
</id>
-
<#else>
-
</property>
-
</#if>
-
</#list>
-
</#if>
-
</class>
- </hibernate-mapping>
4 注册
首先是对生成的hbm.xml的注册,比如,我获取倒Hibernate的一个config以后
然后就是要通知sessionFactory,新增了持久类,目前很多方法都是重启sessionfactory,就是关闭当前 sessionFactory ,然后根据config build一个新的sessionFactory出来,但是,这种情况感觉总不那么完美,虽然这个过程持续不到多长时间,但用户每增一个表就close然后build一个,单说用户体验,人家正在提交数据了,你把这个给close了....
但目前hibernate包的 sessionFactory 确实没提供这种对持久类的add支持,XX伟人说过:没有条件 创造条件也要上,于是乎,拿起你的键盘,启动 editplus,向hibernate3的源码砍去。。
Java代码
-
一是,改动Configuration,三句话
-
public Mapping getMapping()
-
{
-
return this.mapping;
- }
然后是SessionFactoryImpl 我们要让他知道,这个世界上还存在很多未知的来客,需要你去主动了解。。。。
增加代码
-
public void addPersistentClass(PersistentClass model,Mapping mapping)
-
{
-
if ( !model.isInherited() ) {
-
IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator(
-
settings.getDialect(),
-
settings.getDefaultCatalogName(),
-
settings.getDefaultSchemaName(),
-
(RootClass) model
-
);
-
if (!identifierGenerators.containsKey(model.getEntityName()))
-
identifierGenerators.put( model.getEntityName(), generator );
-
}
-
-
model.prepareTemporaryTables( mapping, settings.getDialect() );
-
String cacheRegion = model.getRootClass().getCacheRegionName();
-
-
CacheConcurrencyStrategy cache = CacheFactory.createCache(
-
model.getCacheConcurrencyStrategy(),
-
cacheRegion,
-
model.isMutable(),
-
settings,
-
properties
-
);
-
if (cache!=null)
-
allCacheRegions.put( cache.getRegionName(), cache.getCache() );
-
-
-
EntityPersister cp = PersisterFactory.createClassPersister(model, cache, this, mapping);
-
if ( cache != null && cache.getCache() instanceof OptimisticCache ) {
-
( ( OptimisticCache ) cache.getCache() ).setSource( cp );
-
}
-
entityPersisters.put( model.getEntityName(), cp );
- }
最后遗留的是hbm.xml在cfg.xml的注册,以保证系统重启后可以顺利加载新增的持久化配置
-
/**
-
* 把hbm.xml的路径加入到cfg.xml的mapping结点
-
*
-
* @param cfg.xml的路径
-
* @param hbm.xml的路径
-
*/
-
public static void updateHbmCfg(URL url,String hbm)
-
{
-
try
-
{
-
SAXReader reader = new SAXReader();
-
Document doc = reader.read(url);
-
Element element = (Element)doc.getRootElement()
-
.selectSingleNode("session-factory");
-
-
Element hbmnode = element.addElement("mapping");
-
hbmnode.addAttribute("resource", hbm);
-
String filepath = url.getFile();
-
if (filepath.charAt(0)=='/')
-
filepath = filepath.substring(1);
-
FileOutputStream outputstream = new FileOutputStream(filepath);
-
XMLWriter writer = new XMLWriter(outputstream);
-
writer.write(doc);
-
outputstream.close();
-
}
-
catch (Exception e)
-
{
-
e.printStackTrace();
-
}
- }
分享到:
相关推荐
Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。在Hibernate中,自定义查询是扩展其功能的重要方式,能够帮助我们实现更复杂的数据库交互需求。本文...
4. **配置SessionFactory**:在Hibernate配置文件(hibernate.cfg.xml)中,添加自定义类型的相关配置。 ```xml <hibernate-configuration> ... <!-- 添加自定义类型 --> ... </hibernate-configuration...
HibernateSessionFactory.java
在Java的持久化框架Hibernate中,`SessionFactory`是核心组件之一,它负责管理数据库会话并提供对象-关系映射(ORM)的功能。本篇文章将深入探讨`SessionFactory`的使用,以及如何创建和操作它。 `SessionFactory`...
这篇博客"JPA + Hibernate 3 CRUD操作历史审计日志的解决方案"将深入探讨如何实现这一需求。 首先,我们需要理解JPA和Hibernate的基础概念。JPA定义了一组用于持久化Java对象的API,它允许开发者通过面向对象的方式...
本篇文章将深入探讨`HibernateSessionFactory`及其在Hibernate中的作用,以及如何使用它来实现增、删、查、改(CRUD)操作。 `SessionFactory`是Hibernate的核心组件,它是线程安全的,负责管理数据库连接和会话。`...
Spring会自动将SessionFactory注入到Repository中,无需手动创建Session。在上述代码中,`getCurrentSession()`返回了一个与当前线程绑定的Session,简化了事务管理。 此外,为了处理事务,还需要在Spring配置文件...
在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...
Session s= HibernateSessionFactory.getSession(); 就是Hibernate的工具java类
hibernate中的SessionFactoryhibernate中的SessionFactoryhibernate中的SessionFactory
用于获得Session会话及关闭Session会话
总结一下,实现Spring与Hibernate的多数据库解决方案,主要涉及以下几个步骤: 1. 配置多个数据源,分别用于读和写操作。 2. 创建与数据源相对应的Hibernate SessionFactory,确保数据流向正确的数据库。 3. 可选地...
通过《Hibernate应用开发完全手册(源码)》中的源码分析,开发者不仅可以掌握Hibernate的基本用法,还能深入了解其内部工作机制,这对于优化代码、解决实际问题以及设计高性能的数据访问层具有重大意义。...
然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。以下是一些关于如何在Hibernate环境下优化批量数据处理的策略。 首先,了解问题的根源。在上述例子中,当尝试向...
在Java Web开发中,Spring和Hibernate是两个非常重要的框架,它们常常被联合使用来处理数据库操作,如增、删、改、查(CRUD)。本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作...
标题提到的"新Hibernate SessionFactory().getCurrentSession()猫腻"揭示了一个常见的使用误区或者说是陷阱,即不正确地使用SessionFactory的getCurrentSession()方法。这篇文章可能探讨了这个方法在实际应用中的...
### Hibernate 实现动态表查询的多种解决方案 #### 一、前言 在使用Hibernate进行数据库操作时,我们经常需要根据不同的需求对不同的表进行查询。特别是在处理多表、多库等复杂场景时,如何实现动态表查询就显得尤...