Hibernate自引用多个使用注释连接到单个列表中

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

我面临着一个类似于Tinder匹配逻辑的问题,所以我以它为例

通过使用带有两个用户引用的公共匹配实体,我的用户可以彼此“匹配”

@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;