java - 迷惑与势是有关系的

标签 java mysql hibernate oop

我正在尝试配置一个新的数据库设计,因为我们已经决定迁移到 Hibernate。以前在我的 Java 代码中我有以下三个类

super 类

public abstract class Card {
    
    private String firstname;
    private String lastname;
    private String email;
    ...
}

卡片子类

public class ContactCard extends Card{
    private String variable1;
    private String variable2;
    private String variable3;

    public ContactCard(){

        super(firstname, lastname, email);
        ...
    }
}

还有其他一些要跟进。这似乎工作正常。但是我开始有点困惑。这里我们有 is a 关系中的子类,一些卡片卡片。不过,我无法将其映射到数据库表中。

例如,为了将卡片表的过程合并到数据库中,我可以为每个子类类型创建一个表,并且在该表中我可以有一个引用卡片表的 id(在用户注册时生成) ).但是,这现在意味着在我的数据库中,我已经将 is a relationship 转换为 has a? 子类现在有一张卡片,而不是一张卡片。

我很困惑,希望有人能为我解决问题。

谢谢

最佳答案

混淆源于 ORM 必须将对象转换为关系,反之亦然。 is a 是一种关系,表示 OOP 术语中的子类,即扩展基类 的类。但是,在 RDBMS 术语中,您有关系(或表,两者意思相同)和属于所述关系的记录/实体。

现在,如果您有一个映射到您的 Card 类的表,那么子类(我暂时称它为 MyCard)本身不能继承你的 RDBMS,因为没有继承。因此,不是继承记录,而是需要一些约定来表示该概念。

如果 MyCard 有一个 foreign key 映射到 Card,那么这意味着存在多对一关系(只要因为 Card 也没有 外键,在这种情况下会有一对一的关系。

如果我必须在表中创建一个 is a 关系,那么我想到的第一个(但不是最好的)想法是拥有一个外键CardMyCard 之间的关系中,因为这在技术上会强制两个表之间的关系不被复制。但是,如果您有一个 MyCard 基关系和一些其他可能的关系,例如 MyCard1MyCard2、... MyCard999 而您的 Card 不一定与它们中的每一个都匹配,那么您的 Card 关系将填充 999 个很少有值的字段。

即使只有一个 MyCard 关系,从 Card 到它的 外键 也是不必要的,因为,如果我们始终如一将它用作是一个关系,那么它将是一个关系而不是有一个,即使没有技术差异在两种表示之间。

因此,最好只创建一个从 MyCardCard外键,因为这样

  • 您的架构尽可能简单
  • 您的架构尽可能易于维护

那么,我们如何在 OOP 中表示它呢?

我们可以在 MyCard 中有一个字段代表 Card

简而言之:这看起来像一个是一个关系,但由于它一直被用作一个有一个关系,它本质上是一个有一个 关系。

关于java - 迷惑与势是有关系的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451873/

相关文章:

PHP mySQL 查询无法使用 SQL TIME 类型字段中的变量

java - 如何在Spring中使用Template Hibernate保存继承的类

java - 单击时更改 android 按钮颜色而不更改边框颜色?

java - 每个 JavaDoc 页面上的 Logo

mysql - 通过 MySQL Workbench 添加新列到现有表中

mysql - Apache 的 htdocs 文件夹发生了什么变化?

java - Hibernate 应用程序作为 Azure 中的 WebJob "Could not open connection"异常

oracle - 具有 Oracle 标签安全性的 JPA/Hibernate

java - 过滤自动完成适配器的 json 结果

java - 车牌之间的距离