Mapping persistent classes(Chapter 3 of Hibernate In Action)
发布日期:2025-04-11 23:10:40 浏览次数:11 分类:精选文章

本文共 913 字,大约阅读时间需要 3 分钟。

在Java的对象等式、对象身份以及数据库身份这三个不同的身份识别机制之间,我们需要找到一个平衡点。这些概念不仅关系到Java程序的运行机制,也直接影响到数据库的数据存储方式。

对象身份(Object Identity)是指在Java虚拟机(JVM)中,对象所占用的内存地址。如果两个对象是同一个内存对象,可以通过"=="运算符进行比较。这是一种直观且高效的方式来判断对象的身份。

对象等式(Object Equality)则是衡量两个对象是否具有相同的值的标准。通过equals()方法,我们可以判断两个对象是否具有相同的内容或状态。需要注意的是,大多数类默认情况下,equals()方法是基于对象身份进行比较的。如果没有自定义实现equals()方法,对象等式的判断结果将直接受到对象身份的影响。

数据库身份(Database Identity)则是在关系型数据库中,对象的存储位置决定了它的身份。具体而言,对象如果在数据库中占据同一行(即同一表单记录),那么它们可以被视为相同的对象。这种识别方式依赖于数据库的物理存储结构,即表和主键的组合。

在将面向对象的程序结构映射到关系型数据库时,我们可以采取三种主要的策略:

第一种方法是"表 per concrete class"(每个具体类对应一张表)。这种方法完全抛弃了多态性和继承关系,将对象之间的关系转化为简单的属性存储。这种方法简单易行,但无法充分体现对象间的继承关系。

第二种方法是"table per class hierarchy"(每个类继承结构对应一张表)。这种方法通过在表中添加一个类型辨别列来实现多态性。通过这种方式,我们可以在同一个表中存储不同类的实例,并通过类型信息来区分它们的具体类型。

第三种方法是"table per subclass"(每个子类对应一张表)。这种方法通过建立外键关系,将"是"(is a)关系转化为"拥有"(has a)关系。通过这种方式,我们可以在父子类之间建立明确的关联关系。

这些方法各有优劣,选择哪种方法取决于具体的业务需求和数据结构特点。在实际应用中,我们需要根据项目的具体情况,权衡各自的优缺点,做出最合适的选择。

上一篇:mapping文件目录生成修改
下一篇:Mapper映射文件传参(数组/集合)与#{}和${} 区别

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月29日 18时01分37秒