具有 JoinTable 和非唯一 ID 的 OneToMany

问题描述 投票:0回答:1

我有一个奇怪的数据库设置,我想用hibernate进行映射,有一个表

user
和一个表
post
,它们之间有多对多的关系,但这种关系是通过一个连接表完成的,它引用了
user
的主键,但不是
post
的主键,它引用了该表的非唯一列。

我设法使用

@ManyToMany()
和下面的代码来映射它,它似乎有效,但我想知道引用非唯一列是一件好事还是我不应该这样做,因为它可能会在某些边缘情况下中断.

user (
  id -- pkey
)

post (
  id -- pkey
  join_id -- non unique
)

user_posts (
  user_id -- references user.id
  post_join_id -- references post.join_id
)

在Java中:

public class User {
    @Id
    long id;
    
    @ManyToMany()
    @JoinTable(
        name = "user_posts",
        joinColumns = @JoinColumn(
            name = "user_id",
            referencedColumnName = "id"
        ),
        inverseJoinColumns = @JoinColumn(
            name = "post_join_id",
            referencedColumnName = "join_id"
        )
    )
    Set<Post> posts;
}

public class Post {
    @Id
    long id;
    
    long join_id;
}

考虑到多个帖子具有相同的 join_id,这是进行映射的正确方法吗?我找不到太多关于在非唯一列上进行此类联接的信息。

谢谢。

java database hibernate
1个回答
0
投票

如果您的帖子表已经有一个唯一的 ID 列,为什么不使用它而不是 join_id 列呢? 一般来说,使用 Hibernate 在 @ManyToMany 关系中引用联接表中的非唯一列可能会导致潜在问题。这里的核心问题是,在典型的 @ManyToMany 映射中,Hibernate 希望用于连接的列唯一标识两个表中的行。如果您使用非唯一列,它可能会带来歧义,特别是在获取或管理关系时。

潜在问题是:

  1. 不明确的映射
  2. 级联问题
  3. 性能问题
© www.soinside.com 2019 - 2024. All rights reserved.