Hibernate自引用多个使用注释连接到单个列表中
我面临着一个类似于Tinder匹配逻辑的问题,所以我以它为例 通过使用带有两个用户引用的公共匹配实体,我的用户可以彼此“匹配”Hibernate自引用多个使用注释连接到单个列表中,hibernate,jpa,join,annotations,mappedby,Hibernate,Jpa,Join,Annotations,Mappedby,我面临着一个类似于Tinder匹配逻辑的问题,所以我以它为例 通过使用带有两个用户引用的公共匹配实体,我的用户可以彼此“匹配” @Data @Entity @Table(name = "match") @EqualsAndHashCode(callSuper = true) public class Match extends PanacheEntity { @Column(name = "matchDate") Calendar ma
@Data
@Entity
@Table(name = "match")
@EqualsAndHashCode(callSuper = true)
public class Match extends PanacheEntity {
@Column(name = "matchDate")
Calendar matchDate;
@ManyToOne
@JsonIgnore
User userA;
@ManyToOne
@JsonIgnore
User userB;
}
}
我喜欢从两个用户实体对象中引用用户所属的所有匹配项,但是我需要选择(假设使用“mappedBy”)关系的另一端,即第一个或第二个用户
@Data
@Entity
@Table(name = "user_")
@EqualsAndHashCode(callSuper = true)
public class User extends PanacheEntity {
@Column(name = "email")
String email;
@Column(name = "name")
String name;
// Needs to contain all "Matches", no matter if the user is referenced as "A" or "B"
@OneToMany
List<Match> matches;
}
无论我是被邀请者还是被邀请者,作为一个用户,我都能获得与之相关联的任何连接对象。
有没有办法使用Hibernate注释来实现它?您可以使用
@JoinColumn
来指定列名
连接
@Data
@Entity
@Table(name = "connection")
@EqualsAndHashCode(callSuper = true)
public class Connection extends PanacheEntity {
@ManyToOne
@JsonIgnore
@JoinColumn(name = "inviter_id")
User inviter;
@ManyToOne
@JsonIgnore
@JoinColumn(name = "invited_id")
User invited;
}
用户
@Data
@Entity
@Table(name = "user_")
@EqualsAndHashCode(callSuper = true)
public class User extends PanacheEntity {
@Column(name = "email")
String email;
@Column(name = "name")
String name;
@OneToMany(mappedBy = "inviter")
List<Connection> inviterConnections;
@OneToMany(mappedBy = "invited")
List<Connection> invitedConnections;
}
非常感谢:)遗憾的是,它没有按预期工作。它仍然需要另一侧的“mappedBy”属性指向两个用户变量之一,否则结果为空。你知道如何将其映射到两者吗?我添加了mapped by和Update answer,请测试相同的答案。但是现在我们为每个用户提供了两个列表,我想阻止这些用户,我想创建一个具有所有常见连接的列表,而不区分受邀请者和受邀请者。另一个例子是火柴比赛,我对比赛和双方都感兴趣,而不是谁邀请谁。也许我应该从一开始就用这个例子来说明,sryy你不需要添加mapped by。您可以使用连接存储库从连接表中获取数据。如果您共享您的服务类代码,这将很有帮助。
@Data
@Entity
@Table(name = "user_")
@EqualsAndHashCode(callSuper = true)
public class User extends PanacheEntity {
@Column(name = "email")
String email;
@Column(name = "name")
String name;
@OneToMany(mappedBy = "inviter")
List<Connection> inviterConnections;
@OneToMany(mappedBy = "invited")
List<Connection> invitedConnections;
}
@JoinColumns(value = {
@JoinColumn(name = "id", referencedColumnName = "inviter_id"),
@JoinColumn(name = "id", referencedColumnName = "invited_id") })
User user;