【发布时间】:2018-06-28 15:04:09
【问题描述】:
我正在为现有数据库创建 Spring 4 / Spring Data 应用程序。数据库结构和数据由闭源软件定义。
现有系统的一个方面是您可以对系统中的任何项创建评论。这意味着,一篇文章、一个文档、一个媒体文件(系统中的所有实体)可以有任意数量的 cmets,并且每个评论恰好针对系统中的一个实体。所有 cmets 都在 相同 comment 表中。
实现的方式是表comment 有一个列comment_for,它包含对它作为注释的实际实体的连接/命名空间/前缀引用。当前系统似乎只是通过在主键前面加上表名来构建连接查询:
此示例显示了两个 cmets,一个用于 article.id 为 12345 的文章,一个用于document.id 为 42 的文档。我创建了 @Entities 匹配数据库表和相应的存储库接口与查询方法我需要。
我想利用 Spring Data Repositories / Entities 来用相应的 cmets 填充我的实体集合,就像实体文章的这个(伪代码)。
@OneToMany(mappedBy = "comment_for", prefix = "article:")
private List<Comment> comment = new ArrayList<>();
我只需要它单向。我的实体(目前Article、Document 和Mediafile)应该持有他们的 cmets 的集合。我不需要 cmets 来保留对实体的引用。
有没有办法做到这一点?生成的 SQL 查询应该类似于
SELECT * FROM .... WHERE comment.comment_for = concat('<entityname>:', <entity>.id);
我查看了@JoinColumn,但无法修改连接的使用值,只能修改列名。我目前唯一的解决方案是 CommentRepository 接口上的手动 @Querys,它为我提供了某个实体/ID 组合的所有 cmets 的 ArrayList。但我想让 cmets 作为我的业务实体的一部分自动加入。
更新:看起来我可以将comment_for 中的命名空间和ID 拆分为两个新列,而不会中断现有软件。这两列现在是comment_for_id 和comment_for_entityname
【问题讨论】:
-
comment_for中键值对的作用是什么?如果您的实体 id 与 comment_for 中的值完全匹配,它应该可以解决您的问题。可以修改表吗?您还可以拆分 comment_for 以仅包含像您的实体一样的 id。添加一个额外的列,如 entity_type 将允许您避免不同实体之间的重复 id 值。
-
我没有编写创建表/插入数据的软件,但他们使用它来附加/连接 cmets 与任何其他实体。我喜欢 entity_type 的想法。 Spring 将如何解决。使用@JoinColumns?我必须看看我是否可以使用存储过程来拆分comment_for,因为写入数据的系统不在我的控制之下
-
您可以在实体和评论之间关系的所有者方面使用@JoinCoumn。在您的情况下,它看起来像是 Comment 实体/表,因为每个实体都有许多 cmets。只要您能够使用一些 PL/SQL 创建一个新的修改结构,那应该可以工作。希望这会有所帮助!
-
谢谢。如果你用对应的代码sn-ps写一个答案帖子,我可以接受它作为解决方案。
标签: java spring jpa spring-data-jpa spring-data