我的目标是使用table filesData创建数据库结构,其中将存储有关上载文件的信息,以及另一个用于其他对象的表。
某些对象可以链接到filesData表,例如博客帖子,新闻等的表格。这些对象中的每一个都必须包含许多链接文件。例如,新闻帖可以有很多图片。在这种情况下,应该为每种类型使用“中间”表,即对于新闻帖shuold是3个表:NewsTable,NewsToFilesRelationsTable,filesData。这是标准的方式。
但现在我想构建另一种方式:我想为每个对象设置文件集的setter方法,包含文件链接的内容,以及使用自定义元注释注释此方法:
@MyFileAnnotation
public void setFiles(Set<FilesData> fd) {
this.fd= fd;
}
但是如何存储这些数据?我不想制作“中间”表,将对象与filesData表中的文件记录关联起来。另一种变体 - 在此表中创建一个表filesDataRelation并存储关系数据。在这种情况下 - 这个表的结构必须是什么?该表不仅必须具有链接对象记录的ID,而且还必须具有对象数据类型的行(它可以是对象表的全名)。
如何建立这种方式?
答案 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} } - 它是子表中列的名称。
此解决方案并不是最正确的解决方案 - 它只是有效。