【问题标题】:Hibernate Docs Contradiction: SQL Normalization vs Entity Mapping on Multiple TablesHibernate Docs 矛盾:SQL 规范化与多个表上的实体映射
【发布时间】:2012-08-07 09:40:42
【问题描述】:

Hibernate 文档声明如下:

5.1.6.5。将一个实体映射到多个表

虽然不推荐用于新架构,但一些旧数据库强制 你的[原文如此] 将单个实体映射到多个表上。

我已经阅读了大量有关数据库规范化的内容,但我真的不明白如何既能规范化数据库又不能将实体映射到多个数据库表上,除非您映射多个不同的实体并执行奇怪的连接语句手动。或者,您映射 7 个不同的实体并将它们传输到一个 POJO。有没有什么地方展示了如何开发一个“新模式”,它既是规范化的,又需要一个实体来从数据库数据转换为 java 对象?

另外,我知道在当今廉价存储的世界中,完全规范化并不是必需的,但我发现这个陈述与我读过的所有其他内容不一致。我正在寻找规范化到非规范化的平衡,但没有找到使用 Java Persistence API 的简单方法。

编辑:

例子:

如果我的用户实体具有以下内容:

@Entity
public class User {
    long id;        
    String name;
    String email;

    int countryCode;

    List<Images> uploadedImages;
}

我不会将用户的国家名称和图像集合存储在同一张表上,而是将国家/地区放在一张表上:

Table Countries    Country_Code    Country_Name
                   AF              Afghanistan etc....

带有国家代码和国家名称,然后打开,并将图像上传到带有用户 ID 的单独表格中,

Table UploadedImages    User_Id      Image_Name    Image_Url
                        1            Hello.jpg     Amazon S3
                        1            Goodbye.jpg   Photobucket

那么我该如何只使用一个实体呢?或者我是否使用来自第一个实体的信息从数据库中获取三个单独的实体?如您所知,我对基本架构有点困惑,如何将上面的数据转换为 java 对象?

【问题讨论】:

  • 您能否提供一个您认为应该映射到多个表的实体示例?
  • 如果我有一个具有唯一 ID 和电子邮件地址的用户实体,我该如何将其映射到多个表?
  • @BedwyrHumphreys - 我希望这是我需要存储的唯一信息。

标签: java mysql hibernate normalization


【解决方案1】:

文档所说的与数据规范化无关。这与数据分区/表优化有关。因此,如果您有一个包含大二进制列的表,您可能不希望它与主数据位于同一个表中。这在过去更为常见,因为当时的衡量标准认为小数据在当时被认为是“大”数据。

另一方面,规范化在 OOP(和 Hibernate)中非常受欢迎。一切都是为了把东西放在他们的地方,minimize redundancy and dependency

【讨论】:

    【解决方案2】:

    举个例子

    @Entity
    public class User {
        long id;        
        String name;
        String email;
    
        int countryCode;
    
        List<Images> uploadedImages;
    }
    

    这里有 3 个实体 - 一个 User、一个 Country 和一个 Image 实体,每个实体可能映射到 3 个表 - 每个表一个实体和一个用于图像列表的连接表。

    所以你的 User 类就变成了

    @Entity
    public class User {
    
        long id;        
    
        String name;
    
        String email;
    
        Country country
    
        List<Images> uploadedImages;
    }
    
    @Entity
    public class Country {
    
        long id;        
    
        String name;
    
    }
    
    @Entity
    public class Image{
    
        long id;        
    
        String name;
    
        String url;
    
    }
    

    您需要添加注释以将属性映射到正确的表和列。

    【讨论】:

    • 谢谢。这个答案帮助我克服了一个很大的概念障碍。我没有将父实体和子实体分开区分,并且无法区分这两者使得设计我的数据库和对象变得非常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多