在Hibernate 5.x中,Hibernate将实体名称映射到数据库中时,将这个过程分成两个步骤:
- 第一个阶段是从对象模型中提取一个合适的逻辑名称,这个逻辑名称可以由用户指定,通过@Column和@Table等注解完成,也可以通过被Hibernate的
ImplicitNamingStrategy
指定; - 第二个阶段是将上述的逻辑名称解析成物理名称,物理名称是由Hibernate中的
PhysicalNamingStrategy
决定;
在之前,我在Hibernate中实体映射时的命名策略(1)中详细说明了通过继承DefaultNamingStrategy
来指定我们的自己的命名策略,但是从Hibernate 5.X开始,命名策略就被分成上述的两个步骤,从官方的文档中的得知这样做的目的是提高灵活性,减少构建命名策略过程中用到的重复的信息。
但是从目前看来,我自身并没有感觉到这种从新设计的好处,反而有点复杂。
一、ImplicitNamingStrategy
当一个实体对象没有显式的指明它要映射的数据库表或者列的名称时,在Hibernate内部就要为我们隐式处理,比如一个实体没有在@Table中的指明表名,那么表名隐式的被认为是实体名,或者@Entity中的提供的名称。
这些隐式的处理都是Hibernate帮我们做的,Hibernate中定义了多个ImplicitNamingStrategy的实现,可以开箱即用。而之前的逻辑名名称就是物理名称这种策略只是其中一种,其他还包括:
- ImplicitNamingStrategyJpaCompliantImpl:默认的命名策略,兼容JPA 2.0的规范;
- ImplicitNamingStrategyLegacyHbmImpl:兼容Hibernate老版本中的命名规范;
- ImplicitNamingStrategyLegacyJpaImpl:兼容JPA 1.0规范中的命名规范
- ImplicitNamingStrategyComponentPathImpl:大部分与ImplicitNamingStrategyJpaCompliantImpl,但是对于@Embedded等注解标志的组件处理是通过使用attributePath完成的,因此如果我们在使用@Embedded注解的时候,如果要指定命名规范,可以直接继承这个类来实现;
它们之间的关系如下:
那我们在哪设置这些策略以便它们起作用呢?
方法1:
在Hibernate的配置信息设置的时候,如下:
Configuration config = new Configuration().configure();
config.setImplicitNamingStrategy(ImplicitNamingStrategyComponentPathImpl.I