同一实体上多对多

时间:2019-01-26 14:55:11

标签: java spring hibernate jpa relational-database

我想创建一个类似instagram的应用程序。因此,应该假定用户具有跟随的用户列表以及跟随他的用户列表。
到目前为止,这是我所做的:

@ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(name = "following_followers",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "followedby_id")
)
private List<User> followers;

@ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(name = "following_followers",
        joinColumns = @JoinColumn(name = "followedby_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> following;

我检查了this个帖子,并按照那边的好答案做了,但是我不确定这项工作是否可以完成。

2 个答案:

答案 0 :(得分:0)

由Hibernate管理的many-to-many关联问题是您无法自己控制联接表following_followers。例如,您不能使用Hibernate从此类表中删除记录。

在某些情况下,这样的many-to-many关联可以有效,但是我不确定这是否是您的情况。例如,想象一下如何删除用户的关注者。

您可以尝试其他方法:为以下关系添加单独的实体

@Enity
class Following {

  @ManyToOne(fetch = FetchType.LAZY)
  User from;

  @ManyToOne(fetch = FetchType.LAZY)
  User to;

}

您还可以添加一个唯一约束:(from, to)可能是合适的。

答案 1 :(得分:0)

这是我为您解决的问题的解决方案。 用户类别:

@Entity
public class Followers {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    @ManyToOne
    @JoinColumn(name="from_user_fk")
    private User from;

    @ManyToOne
    @JoinColumn(name="to_user_fk")
    private User to;

    public Followers() {};

    public Followers(User from, User to) {
        this.from = from;
        this.to = to;
    }
}

如您所见,用户类别对正在关注的用户和他所关注的用户都有引用。

from Tkinter import *
from PIL import ImageTk, Image

app = Tk()

def do(event):
    print("Button Clicked!")
    #...

img = ImageTk.PhotoImage(Image.open("Button.gif"))
button = Label(app, image = img)
button.pack()

button.bind('<Button-1>', do)

app.mainloop()

followers类包含两个用户之间的关系,当然,您可能需要向该类添加更多信息,例如“ from”开始跟随“ to”之后。

如果您想吸引用户的关注者/关注者,您只需致电相应的获取者即可。