Hibernate自我引用ManyToMany加入带有注释的单个列表

问题描述

我遇到的问题与Tinder的匹配逻辑相似,因此我以它为例。

enter image description here

我的用户可以通过具有带有两个用户引用的公共匹配实体来实现彼此之间的“匹配”。

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

我希望“列表”匹配项将填充以下查询所表示的对象,即与用户相关的所有匹配项,与列无关。

select distinct match.id,user_a_id,user_b_id
from match,user_
where user_.id = match.user_a_id
   or user_.id = match.user_b_id

可以为我提供与我关联的任何连接对象的用户,无论我是邀请还是被邀请的人。

有什么方法可以使用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;
}

根据评论进行更新

您可以在@JoinColumns上尝试Connection,如下所示,但这会给您和条款。

@JoinColumns(value = {
            @JoinColumn(name = "id",referencedColumnName = "inviter_id"),@JoinColumn(name = "id",referencedColumnName = "invited_id") })
User user;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...