Hibernate - DataBase结构建模

时间:2015-02-17 12:19:50

标签: java spring hibernate hibernate-mapping

我的目标是使用table filesData创建数据库结构,其中将存储有关上载文件的信息,以及另一个用于其他对象的表。

某些对象可以链接到filesData表,例如博客帖子,新闻等的表格。这些对象中的每一个都必须包含许多链接文件。例如,新闻帖可以有很多图片。在这种情况下,应该为每种类型使用“中间”表,即对于新闻帖shuold是3个表:NewsTable,NewsToFilesRelationsTable,filesData。这是标准的方式。

但现在我想构建另一种方式:我想为每个对象设置文件集的setter方法,包含文件链接的内容,以及使用自定义元注释注释此方法:

@MyFileAnnotation
public void setFiles(Set<FilesData> fd) {
        this.fd= fd;
}

但是如何存储这些数据?我不想制作“中间”表,将对象与filesData表中的文件记录关联起来。另一种变体 - 在此表中创建一个表filesDataRelation并存储关系数据。在这种情况下 - 这个表的结构必须是什么?该表不仅必须具有链接对象记录的ID,而且还必须具有对象数据类型的行(它可以是对象表的全名)。

如何建立这种方式?

2 个答案:

答案 0 :(得分:0)

如果您不想使用另一张桌子,那么我不认为有更好的方法可以做到这一点。也许你想考虑使用一些NoSQL数据库?我最近在我的最新项目中做到了这一点。一些数据存储在Postres中,其余数据存储在MongoDB中。 Mongo集成有一个非常好的java库。查看spring-data-mongodb

答案 1 :(得分:0)

解决方案很简单。

我已经制作了表framework_files并将其与JPA映射到对象FrameworkFiles implements java.io.Serializable。此表包含linkedObjectID int列和linkedObjectName varchar(250)列。

在另一个表中,例如 - 在表publicSitePortfolioWorks中,映射到public class PublicSitePortfolioWorks implements java.io.Serializable {的列有id int (PK)linkedObjectName varchar(250)列。所有行(记录)中的列linkedObjectName都有一个(静态?)值,可能与表名相同。例如:

ID | SomeCols | linkedObjectName

1 | blablabla | publicSitePortfolioWorks

2 | blablabla | publicSitePortfolioWorks

3 | blablabla | publicSitePortfolioWorks

表publicSitePortfolioWorks的实体对象PublicSitePortfolioWorks链接到子表作为一对多的代码

@JoinColumns({
        @JoinColumn(name = "linkedObjectID", referencedColumnName = "id"),
        @JoinColumn(name = "linkedObjectName", referencedColumnName = "linkedObjectName")
    })
    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    private List<FrameworkFiles> framework_files1 = new ArrayList<>();

其中name = "linkedObjectID" - 它是子表中列的名称referencedColumnName = "id" - 它是当前表中列的名称name = "linkedObjectName" - 它是子表中列的名称,{{1} } - 它是子表中列的名称。

此解决方案并不是最正确的解决方案 - 它只是有效。