我将尝试说明我想尽快实现的目标...假设我有一个用户表:
USER_INFO
USER_ID [PK]
USER_NAME
PASSWORD
用于定义每个用户连接的交集表(N:M - ManyToMany)
CONNECTION_INFO
CONNECTION_ID [PK]
USER_A_ID [FK - references USER_INFO(USER_ID)]
USER_B_ID [FK - references USER_INFO(USER_ID)]
CONNECTION_TYPE_ID [FK - references CONNECTION_TYPE(CONNECTION_TYPE_ID)]
CONNECTION_TYPE 很简单:
CONNECTION_TYPE
CONNECTION_TYPE_ID [PK]
CONNECTION_TYPE_NAME [CHECK allowed values are: FRIEND, FAMILY, ...]
在 Spring 方面,我将我的 User 实体定义为:
@Entity
@Table(name = "USER_INFO")
public class User implements Serializable {
@Id
@NotNull
@Column(name = "USER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@Column(name = "USER_NAME)
private String userName;
@Column(name = "PASSWORD)
private char[] password;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "CONNECTION_INFO",
joinColumns = { @JoinColumn(name = "USER_A_ID") },
inverseJoinColumns = { @JoinColumn(name = "USER_B_ID") })
private List<User> connections;
// ctor, getters, setters, toString, ...
}
我有一个 UserRepository 接口,它扩展了 JpaRepository 等。现在,它工作得很好,我可以检索所有连接,无论是朋友、家人、最讨厌的人、被阻止、恶魔等...
现在,我的问题是,如何根据 Connection.Types 只获取给定用户的特定连接?例如,我只想找到朋友,或者只想找到家人,我想你明白我的意思。这个三路交叉表让我很头疼。
@Clarification:我想要的是在我的用户实体上定义的 @ManyToMany 关系,该实体恰好有额外的列。我知道在这种情况下有建议的解决方案,例如LINK。在我的例子中,这个额外的列是第三个表的外键(USER_INFO(保存用户),CONNECTION_INFO(保存用户之间的连接N:M +有关连接类型的信息),CONNECTION_TYPE。如果我可以用它来建模spring-data-jpa 据我了解,我只需要 UserRepository 下的一个神奇的命名方法,类似于(完全不正确):
public interface UserRepository extends JpaRepository<User, Integer> {
List<User> findUserFriendsByConnectionType(User userWhoseFriendsWeAreSearching, String connectionTypeFromTheThirdTable);
}
这就是我想要的。我知道通过为交叉表创建一个实体并打破ManyToMany到OneToMany和ManyToOne,使用普通的额外列很简单,碰巧我有第三个表和可能的ManyToOne(1个连接可以有1个关联类型,而一个连接可以有1个关联类型) type 可以链接到任意数量的连接)与 connection_type 表的交集实体上。
我希望它能澄清一切。上面只是一个示例,我从未想过我们会挂在枚举上,因为我想让它看起来简单,我可能让它变得太简单了:)。
慕工程0101907
相关分类