Hibernate动态模型(Dynamic models)详解
创始人
2024-06-08 02:31:23
0

本文向大家介绍Hibernate动态模型(Dynamic models),可能好多人还不了解Hibernate动态模型(Dynamic models),没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

Hibernate动态模型(Dynamic models)

注意:以下特性在当前处于试验阶段,将来可能会有变化。

运行期的持久化实体没有必要一定表示为像POJO类或JavaBean对象那样的形式。Hibernate也支持动态模型(在运行期使用Map的Map)和象DOM4J的树模型那样的实体表示。使用这种方法,你不用写持久化类,只写映射文件就行了。

Hibernate默认工作在普通POJO模式。你可以使用配置选项default_entity_mode, 对特定的SessionFactory,设置一个默认的实体表示模式。 (参见表 3.3 “ Hibernate配置属性 ”。)

下面是用Map来表示的例子。首先,在映射文件中,要声明 entity-name来代替一个类名(或作为一种附属)。

  1.  
  2.  
  3.      entity-name="Customer"> 
  4.  
  5.          name="id" 
  6.             type="long" 
  7.             column="ID"> 
  8.              class="sequence"/> 
  9.          
  10.  
  11.          name="name" 
  12.             column="NAME" 
  13.             type="string"/> 
  14.  
  15.          name="address" 
  16.             column="ADDRESS" 
  17.             type="string"/> 
  18.  
  19.          name="organization" 
  20.             column="ORGANIZATION_ID" 
  21.             class="Organization"/> 
  22.  
  23.          name="orders" 
  24.             inverse="true" 
  25.             lazy="false" 
  26.             cascade="all"> 
  27.              column="CUSTOMER_ID"/> 
  28.              class="Order"/> 
  29.          
  30.  
  31.      
  32.       
  33.  

注意:虽然是用目标类名来声明关联的,但是关联的目标类型除了是POJO之外,也可以 是一个动态的实体。

在使用dynamic-map为SessionFactory 设置了默认的实体模式之后,可以在运行期使用Map的 Map。

  1. Session s = openSession();  
  2. Transaction tx = s.beginTransaction();  
  3. Session s = openSession();  
  4.  
  5. // Create a customer  
  6. Map david = new HashMap();  
  7. david.put("name", "David");  
  8.  
  9. // Create an organization  
  10. Map foobar = new HashMap();  
  11. foobar.put("name", "Foobar Inc.");  
  12.  
  13. // Link both  
  14. david.put("organization", foobar);  
  15.  
  16. // Save both  
  17. s.save("Customer", david);  
  18. s.save("Organization", foobar);  
  19.  
  20. tx.commit();  
  21. s.close(); 

动态映射的好处是,变化所需要的时间少了,因为原型不需要实现实体类。然而,你无法进行 编译期的类型检查,并可能由此会处理很多的运行期异常。幸亏有了Hibernate映射,它使得数 据库的schema能容易的规格化和合理化,并允许稍后在此之上添加合适的领域模型实现。

实体表示模式也能在每个Session的基础上设置:

  1. Session dynamicSession = pojoSession.getSession(EntityMode.MAP);  
  2.  
  3. // Create a customer  
  4. Map david = new HashMap();  
  5. david.put("name", "David");  
  6. dynamicSession.save("Customer", david);  
  7. ...  
  8. dynamicSession.flush();  
  9. dynamicSession.close()  
  10. ...  
  11. // Continue on pojoSession  

请注意:用EntityMode调用getSession()是在 Session的API中,而不是SessionFactory。 这样,新的Session共享底层的JDBC连接,事务,和其他的上下文信 息。这意味着,你不需要在第二个Session中调用 flush()和close(),同样的,把事务和连接的处理 交给原来的工作单元。

关于XML表示能力的更多信息在XML映射中找到,这里我们就不加以介绍了。

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. 简单学会Hibernate对象持久化
  5. 分析Hibernate自增主键

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...