Hibernate中实体映射时的命名策略(2)

在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
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
映射框架是指通过使用对象关系映射(ORM)技术,将数据库的表与Java类之间的映射关系完全自动化,实现对象与关系之间的无缝转换。Hibernate是一个著名的全映射框架,它实现了ORM的核心功能。 具体来说,全映射框架可以通过以下方式实现: 1. 对象到表的映射:全映射框架自动将Java类的属性与数据库表的列进行映射。它可以根据命名规则以及注解配置等方式,自动识别字段名、数据类型、约束等信息,并将其映射到相应的数据库表。 2. 表到对象的映射:全映射框架可以将数据库表的数据自动转换为相应的Java对象。它通过查询数据库并将结果集的数据按照映射规则转换为Java对象,实现对象与关系之间的转换。 3. 数据库操作的封装:全映射框架提供了一套API,用于执行常见的数据库操作,如插入、更新、删除和查询。开发人员可以使用面向对象的方式来进行数据库操作,而不需要编写复杂的SQL语句。 举个例子来说明全映射框架的作用: 假设有一个数据库表`employee`,包含了员工的姓名、年龄和工资等字段。我们希望在Java程序操作这个表的数据。使用全映射框架,我们可以定义一个与`employee`表对应的Java类,并通过配置或注解的方式,将Java类的属性与表的字段进行映射。 ```java @Entity @Table(name = "employee") public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private int age; @Column(name = "salary") private BigDecimal salary; // 省略构造方法、Getter和Setter等 } ``` 上述代码,`@Entity`注解表示这是一个实体类,对应数据库的一张表。`@Table`注解指定了表的名称。`@Id`注解标识了主键字段,`@GeneratedValue`注解指定主键的生成策略。`@Column`注解用于指定属性与字段的映射关系。 通过使用全映射框架,我们可以使用以下代码进行数据库操作: ```java public class EmployeeDao { private SessionFactory sessionFactory; // 构造方法注入SessionFactory public void save(Employee employee) { Session session = sessionFactory.getCurrentSession(); session.save(employee); } public Employee findById(Long id) { Session session = sessionFactory.getCurrentSession(); return session.get(Employee.class, id); } // 其他数据库操作方法 } ``` 上述代码,`SessionFactory`是全映射框架提供的一个重要组件,用于创建和管理数据库会话。通过调用`sessionFactory.getCurrentSession()`方法,我们可以获取当前线程绑定的数据库会话。然后,我们可以使用会话对象进行数据库操作,如保存、查询等。 使用全映射框架,我们可以更加方便、高效地进行对象与关系之间的转换和操作,简化了数据库操作的编写和管理过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值