Java 使用Hibernate在另一个实体中保存实体数组

Java 使用Hibernate在另一个实体中保存实体数组,java,postgresql,hibernate,Java,Postgresql,Hibernate,我有一个任务实体,它应该包含@OneToMany关系中的用户实体数组 但我无法找到一种在没有链接表的情况下存储所述数组的方法,因为一个用户可能在多个任务中被引用 在任务实体中,关系应该是这样的: @OneToMany(mappedBy = "user") private Set<UserEntity> users = new HashSet<>(0); @OneToMany(mappedBy=“user”) 私有集用户=新哈希集(0); 正确的做法是什么?一行如何保存

我有一个
任务
实体,它应该包含
@OneToMany
关系中的
用户
实体数组


但我无法找到一种在没有链接表的情况下存储所述数组的方法,因为一个用户可能在多个
任务中被引用

任务实体
中,关系应该是这样的:

@OneToMany(mappedBy = "user")
private Set<UserEntity> users = new HashSet<>(0);
@OneToMany(mappedBy=“user”)
私有集用户=新哈希集(0);

正确的做法是什么?一行如何保存一个实体数组?

这样一个用户可以有许多任务,而每个任务可以有许多用户

听起来像是一个经典的风扇陷阱,你需要一个链接表和使用
@ManyToMany

然而,在研究数据访问实现之前,应该对数据结构进行建模

您所描述的是一种多对多关系,在考虑如何使用Hibernate检索数据之前,您的数据库结构应该反映出这一点。

对于单向一对多关系,您可以避免使用联接表(但不建议这样做,请参见下文)。它要求外键位于关系的目标端(关系的多个端)。您需要指定@JoinColumn注释以指向外键列

@OneToMany
@JoinColumn(name="TASK_ID")
private Set<UserEntity> users = new HashSet<>(0);
@OneToMany
@JoinColumn(name=“TASK\u ID”)
私有集用户=新哈希集(0);
不建议这样做,因为: 1) 性能:如果UserEntity状态和任务状态都已更改,则在写入UserEntity时,任务的FK未知,因为UserEntity没有对其的引用。因此,在这种情况下,UserEntity可能会被写入两次,一次用于UserEntity更改,一次用于任务更改。 2) 映射:若UserEntity被分配到不同的任务,并且并没有从UserEntity返回到任务的引用,则上下文中不会有任何更改


因此,在您的情况下,建议使用联接表。

否,一个任务可以由一组用户管理,并且一个用户可以同时管理不同的任务。“所述数组没有链接表”你能举例说明你的观点是怎样的吗?@Chris你能说明你将如何在关系数据库中对数据建模吗?然后我们来看看如何实现hibernate。我可以如何高效地向您展示这一点?我在读PostgreSQLdatabase@Chris您可以发布您的创建脚本。查看下面的评论,chris说应该允许用户管理多个任务。在这种情况下,显然需要使用连接表的多个基数。