我正在为现有数据库创建Spring 4 / Spring Data应用程序 . 数据库结构和数据由闭源软件定义 .
现有系统的一个方面是您可以在系统中的 any 其他项目上创建注释 . 这意味着,文章,文档,媒体文件(系统中的所有实体)可以具有任意数量的注释,并且每个注释完全针对系统中的一个实体 . 所有评论都在 same comment
表中 .
实现它的方式是表 comment
有一个列 comment_for
,它包含对作为注释的实际实体的连接/命名空间/前缀引用 . 当前系统似乎只是通过在主键前加上表名来构建连接查询:
+----+-------------------+----------------+
| id | comment_for | comment |
+----+-------------------+----------------+
| 1| article:12345 | This is nice...|
| 2| document:42 | Cool doc! |
+----+-------------------+----------------+
此示例显示两条注释,一条用于文章,其中 article.id
为12345,另一条用于 document.id
为42的文档 . 我创建了 @Entities
,使用我需要的查询方法匹配数据库表和相应的存储库接口 .
我想利用Spring Data Repositories / Entities来填充我的实体的集合以及相应的注释,例如Entity Article的(伪代码) .
@OneToMany(mappedBy = "comment_for", prefix = "article:")
private List<Comment> comment = new ArrayList<>();
我只需要它单向 . 我的实体(目前 Article
, Document
和 Mediafile
)应该收集他们的评论 . 我不需要注释来保留对实体的引用 .
有没有办法做到这一点?生成的SQL查询应该是类似的
SELECT * FROM .... WHERE comment.comment_for = concat('<entityname>:', <entity>.id);
我查看了 @JoinColumn
,但我无法修改连接的已使用值,只能修改列名 . 我目前唯一的解决方案是在CommentRepository接口上手动 @Query
,它为我提供了某个实体/ ID组合的所有注释的ArrayList . 但我想将评论作为我的业务实体的一部分自动加入 .
Update :看起来我能够将命名空间和id从 comment_for
拆分为两个新列,而不会中断现有软件 . 这两列现在是 comment_for_id
和 comment_for_entityname
1 回答
您还可以将comment_for分解为仅包含与您的实体类似的ID . 添加像entity_type这样的附加列可以避免不同实体之间的重复id值 .
您还可以在实体和注释之间的关系的所有者方使用@JoinColumn . 在您的情况下,它看起来像是Comment实体/表,因为每个实体都有很多注释 .
例:
请注意,我将所有三个字段的组合设置为主键,我不确定在当前设置中使用什么标准作为PK .
这是一个实体的例子 . 这些属性已经用于演示 .