Hibernate文档指出如下:
5.1.6.5. 将一个实体映射到多个表
虽然不建议用于新架构,但某些旧数据库强制 你的[原文如此]在多个表上映射单个实体。
我已经做了很多关于数据库规范化的阅读,我真的不明白你如何既规范化数据库又不映射多个数据库表上的实体,除非你映射几个不同的实体并手动执行一个奇怪的连接语句。 或者,您映射 7 个不同的实体并将它们传输到一个 POJO。 是否有某个地方展示了如何开发一个"新模式",该模式既规范化又需要单个实体从数据库数据转换为 java 对象?
另外,我知道在当今廉价存储的世界中,完全规范化是不必要的,但我只是发现这个陈述与我读过的其他所有内容不一致。 我正在寻找规范化和非规范化的平衡,但还没有找到Java持久性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 对象?
给出你的例子
@Entity
public class User {
long id;
String name;
String email;
int countryCode;
List<Images> uploadedImages;
}
在这里,您有 3 个实体 - 一个用户、一个国家/地区和一个图像实体,每个实体可能映射到 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;
}
此外,您将添加批注以将属性映射到正确的表和列。
文档所说的与数据规范化无关。这与数据分区/表优化有关。因此,如果您有一个包含大二进制文件的列的表,您可能不希望它与主数据属于同一表。这在过去更为常见,因为被今天的衡量标准认为很小的数据在当时被认为是"大"的。
另一方面,规范化在OOP(和Hibernate)中非常受欢迎。这一切都是为了将事情保留在自己的位置上,以最大程度地减少冗余和依赖性。