Hibernate动态模型(Dynamic models)详解

开发 后端
Hibernate动态模型,Hibernate支持动态模型(在运行期使用Map的Map)和象DOM4J的树模型那样的实体表示。使用这种方法,你不用写持久化类,只写映射文件就行了。

本文向大家介绍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来代替一个类名(或作为一种附属)。

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

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

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

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

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

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

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

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

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

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. 简单学会Hibernate对象持久化
  5. 分析Hibernate自增主键
责任编辑:仲衡 来源: javanb
相关推荐

2009-09-24 17:24:20

Hibernate S

2009-09-21 17:33:50

Hibernate基础

2009-09-24 15:53:00

Hibernate J

2025-01-08 08:49:50

2009-09-27 13:57:19

Hibernate树形

2009-06-02 14:46:26

Hibernate关系映射教程

2009-12-30 10:21:36

.NET 4.0

2009-07-09 16:01:27

2009-09-27 10:28:12

Hibernate.p

2009-09-22 11:27:41

模型对象Hibernate

2009-09-23 16:30:01

Hibernate f

2009-09-22 17:25:41

优化Hibernate

2009-09-24 13:03:38

Hibernate C

2009-06-19 14:45:28

Hibernate S

2009-09-23 12:48:54

Hibernate I

2012-02-14 15:51:13

JavaHibernate

2024-12-31 00:08:37

C#语言dynamic​

2011-04-07 11:06:18

Hibernate

2015-04-27 09:50:45

Java Hibern连接池详解

2023-12-06 08:23:44

代理模式设计模式
点赞
收藏

51CTO技术栈公众号