首页 文章

Spring / JPA连接命名空间键

提问于
浏览
0

我正在为现有数据库创建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<>();

我只需要它单向 . 我的实体(目前 ArticleDocumentMediafile )应该收集他们的评论 . 我不需要注释来保留对实体的引用 .

有没有办法做到这一点?生成的SQL查询应该是类似的

SELECT * FROM .... WHERE comment.comment_for = concat('<entityname>:', <entity>.id);

我查看了 @JoinColumn ,但我无法修改连接的已使用值,只能修改列名 . 我目前唯一的解决方案是在CommentRepository接口上手动 @Query ,它为我提供了某个实体/ ID组合的所有注释的ArrayList . 但我想将评论作为我的业务实体的一部分自动加入 .

Update :看起来我能够将命名空间和id从 comment_for 拆分为两个新列,而不会中断现有软件 . 这两列现在是 comment_for_idcomment_for_entityname

1 回答

  • 0

    您还可以将comment_for分解为仅包含与您的实体类似的ID . 添加像entity_type这样的附加列可以避免不同实体之间的重复id值 .

    您还可以在实体和注释之间的关系的所有者方使用@JoinColumn . 在您的情况下,它看起来像是Comment实体/表,因为每个实体都有很多注释 .

    例:

    @Entity
    @NamedQueries({ @NamedQuery(name = "Comments.findAll", query = "select o from Comments o") })
    @IdClass(CommentsPK.class)
    public class Comments implements Serializable {
        private static final long serialVersionUID = 4787438687752132432L;
        @Id
        @Column(name = "COMMENT_TEXT", nullable = false, length = 30)
        private String commentText;
        @Id
        @Column(name = "ENTITY_TYPE", nullable = false, length = 30)
        private String entityType;
        @ManyToOne
        @Id
        @JoinColumn(name = "COMMENT_FOR")
        private EntityDemo entityDemo;
    

    请注意,我将所有三个字段的组合设置为主键,我不确定在当前设置中使用什么标准作为PK .

    这是一个实体的例子 . 这些属性已经用于演示 .

    @Entity
    @NamedQueries({ @NamedQuery(name = "EntityDemo.findAll", query = "select o from EntityDemo o") })
    @Table(name = "ENTITY_DEMO")
    public class EntityDemo implements Serializable {
        private static final long serialVersionUID = -8709368847389356776L;
        @Column(length = 1)
        private String data;
        @Id
        @Column(nullable = false)
        private BigDecimal id;
        @OneToMany(mappedBy = "entityDemo", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
        private List<Comments> commentsList;
    

相关问题