首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate对JPA的扩充

2012-08-28 
Hibernate对JPA的扩展Hibernate 3.1 提供了多种附加的注解,这些注解可以与EJB3的实体混合/匹配使用。他们被

Hibernate对JPA的扩展

Hibernate 3.1 提供了多种附加的注解,这些注解可以与EJB3的实体混合/匹配使用。
他们被设计成EJB3注解的自然扩展。

?

为了强化EJB3的能力,Hibernate提供了与其自身特性相吻合的特殊注解。
org.hibernate.annotations包已包含了所有的这些注解扩展。

?

实体:Entity

@org.hibernate.annotations.Entity
追加了可能需要的额外的元数据,
而这些元数据超出了标准@Entity 中所定义的元数据。

mutable: 此实体是否为可变的

dynamicInsert: 用动态SQL新增

dynamicUpdate: 用动态SQL更新

selectBeforeUpdate: 指明Hibernate从不运行SQL UPDATE除非能确定对象的确已被修改

polymorphism: (指出)实体多态是PolymorphismType.IMPLICIT(默认)还是PolymorphismType.EXPLICIT

persister: allow the overriding of the default persister implementation

允许对默认持久实现(persister implementation)的覆盖

optimisticLock: 乐观锁策略(OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTY 或 OptimisticLockType.ALL)

?

提示:

?

?Queries

由于Hibernate引入了
@org.hibernate.annotations.NamedQuery,
@org.hibernate.annotations.NamedQueries,
@org.hibernate.annotations.NamedNativeQuery 和
@org.hibernate.annotations.NamedNativeQueries 命名式查询,因此Hibernate在命名式查询上比EBJ3规范中所定义的命名式查询提供了更多的特性。
他们在标准版中添加了可作为替代品的一些属性(attributes):

?

flushMode: 定义查询的刷新模式(Always, Auto, Commit或Never)

cacheable: 查询该不该被缓存

cacheRegion: 若查询已被缓存时所用缓存的范围

fetchSize: 针对该查询的JDBC statement单次获取记录的数目

timeout: 查询超时

callable: 仅用于本地化查询(native query),对于存储过程设为true

comment: 一旦激活注释功能,我们会在向数据库交送查询请求时看到注释

cacheMode: 缓存交护模式(get, ignore,normal,或refresh)

readOnly: 不管是否从查询获取元素都是在只读模式下

?

注意,EJB3已公开的最终草案中引入了@QueryHint的概念,
这可能是定义hints更好的方法。

?

Comments

?

1。与EJB3的实体混合/匹配使用

2。为了强化EJB3的能力

4。(指出)实体多态是PolymorphismType.IMPLICIT(默认)还是PolymorphismType.EXPLICIT

5。允许对默认持久实现(persister implementation)的覆盖

6。@javax.persistence.Entity依然是必须遵循的,@org.hibernate.annotations.Entity无意于取而代之。

7。@org.hibernate.annotations.BatchSize</literal>允许你定义批量抓取该实体的实例数量

8。......Hibernate将加载在持久上下文中未经初始化的同类型实体,直至批量数量(上限)

9。@org.hibernate.annotations.Proxy</literal>定义了实体的延迟属性。lazy(默认为true)定义类是否延迟(加载)。......(默认为该类本身)

10。@OnDelete(action=OnDeleteAction.CASCADE)</literal>定义于被连接(joined)的子类:......而非通常的......

11。在tableName表的字段上创建定义好的索引。该注解可以被应用于关键表或者是其他次要的表。

12。<literal>strategy</literal>可以是Hibernate3生成器策略的简称,或者是一个<classname>IdentifierGenerator</classname>实现的(带包路径的)全限定类名。

13。访问类型是根据<literal>@Id</literal>或<literal>@EmbeddedId</literal>在实体继承层次中所处的位置推演而得的。子实体(Sub-entities),内嵌对象和被映射的父类均从根实体(root entity)继承访问类型。

14。你可以覆盖访问类型为:

15。在类层次或属性层次对访问类型进行微调

16。可内嵌的对象

17。被注解元素的访问类型会被覆盖......对于根实体,其访问类型会被认为是整个继承层次中的缺省设置(可在类或属性一级覆盖)

18。若访问类型被标以"property",则Hibernate会扫描getter方法的注解,若访问类型被标以"field",则扫描字段处的注解。

19。你可以覆盖某个属性(property)的访问类型,但是受注解的元素将不受影响:例如一个具有<literal>field</literal>访问类型的实体,(我们)可以将某个字段标注为<literal>@AccessType("property")</literal>,则该字段的访问类型随之将成为property,但是其他字段上依然需要携带注解(此处原文就有误,冒出了两个the)

20。若父类或可内嵌对象没有被注解,则使用根实体的访问类型(即使已经在非直系父类或可内嵌对象上定义了访问类型)。

22。这通常不是必须的,因为类型可以由Hibernate正确推得

23。这些注解被置于类或包一级。......(即使定义于类一级),并且类型定义必须先于任何使用。

24。......,可以在特定字段上定义索引,columnNames属性(attribute)将随之被忽略。

25。SINGLE_TABLE是一种很不错的策略,......

26。鉴别字段?鉴别器?还是识别符?(个人觉得识别符不错,不过之前的H3 Reference中文版好像用的是鉴别器)

27。......,针对识别符方案,使用一段SQL语句作为公式(无需专用字段)--与26有同样问题

29。对遗留schema和历经拙劣维护的schema而言,这或许多有不便......该注解可用于......关联。

30。用@BatchSize为集合设置批量大小?,用@Where设置where子句,用@Check设置check子句,用@OrderBy设置SQL的order by子句,利用@OnDelete(action=OnDeleteAction.CASCADE)设置级联删除策略

31。你也可以利用<literal>@Sort</literal>注解定义一个排序比较器(sort comparator),表明希望的比较器类型,无序,自然顺序或自定义排序,三者择一。

32。你还需要利用<literal>comparator</literal>属性(attribute)指明实现类。

33。比EJB3更胜一筹的是,Hibernate Annotations支持真正的<classname>List</classname>和<classname>Array</classname>

34。以与往常一样的方式映射集合,同时增加@<literal>IndexColumn</literal>。该注解允许你指明存放索引值的字段。你还可以定义代表数据库中首个元素的索引值(亦称为索引基数)。常见取值为0或1。

35。假如你忘了设置<literal>@IndexColumn</literal>,Hibernate会采用bag语义(译注:即允许重复元素的无序集合)

36。Hibernate Annotations还支持核心类型集合(......),可内嵌对象集合,甚至基本类型数组。

37。元素集合......(作为<literal>@OneToMany</literal>的替代)

38。为了定义集合表(译注:即存放集合元素的表,与下面提到的主表对应),要在关联属性上使用@JoinTable注解,joinColumns定义了介乎实体主表与集合表之间的连接字段

39。对于核心类型的集合或基本类型数组,你可以在关联属性上用<literal>@Column</literal>来覆盖存放元素值的字段的定义。你还可以用<literal>@AttributeOverride</literal>来覆盖存放可内嵌对象的字段的定义。

40。旧版本的Hibernate Annotations......由于语义矛盾,......

41。但被认为是不推荐使用的

42。为了优化数据库访问,你可以激活所谓的Hibernate二级缓存。该缓存是可以按每个实体和集合进行配置的。

43。......以及给定二级缓存的范围。......根实体(不是子实体),还有集合

44。给定缓存的并发策略......默认为类的全限定类名或是集合的全限定角色名

45。Hibernate具有数据过滤器的概念,可在运行期应用于一个给定的session。过滤器需要事先定义好。

46。......或......定义过滤器声明,为同名过滤器所用。

47。过滤器声明带有一个name()和一个parameters()序列,<literal>@ParamDef</literal>包含name和type,你还可以为给定的<literal>@filterDef</literal>定义一个defaultCondition()参数,以设置当<literal>@Filter</literal>中没有任何定义时所使用的缺省条件。<literal>@FilterDef</literal>(s)可以在类或包一级进行定义。

48。现在我们来定义应用于实体或集合加载时的SQL过滤器子句。我们使用<literal>@Filter</literal>,并将其置于实体或集合元素上

49。Hibernate引入了......和......,较之EJB3规范中所定义的具名查询,具备了更多的特性。它们新增了一些属性,可以作为标准版的替代方案。

50。flushMode: 定义查询的刷新模式(Always, Auto, Commit或Never)

51。fetchSize: 针对该查询的JDBC statement单次获取记录的数目

52。callable: 仅用于本地化查询(native queries), ......

53。commont:一旦激活注释功能,我们会在向数据库交送查询请求时看到注释

54。readOnly:不论元素是否获取自数据库查询,均处于只读模式

55。这可能是定义hints更好的方法(此处的query hints应该是专用术语)

热点排行