0

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 对象?

4

2 回答 2

1

鉴于你的例子

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

    int countryCode;

    List<Images> uploadedImages;
}

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

所以你的用户类然后变成

@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;

}

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

于 2012-08-10T14:07:55.763 回答
0

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

另一方面,规范化在 OOP(和 Hibernate)中非常受欢迎。一切都是为了让事情保持原状,以尽量减少冗余和依赖

于 2012-08-10T07:50:48.423 回答