第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

spring-data-jpa 3路交叉表

spring-data-jpa 3路交叉表

犯罪嫌疑人X 2024-01-05 10:32:58
我將嘗試說明我想盡快實現(xiàn)的目標...假設(shè)我有一個用戶表: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 等?,F(xiàn)在,它工作得很好,我可以檢索所有連接,無論是朋友、家人、最討厭的人、被阻止、惡魔等...現(xiàn)在,我的問題是,如何根據(jù) Connection.Types 只獲取給定用戶的特定連接?例如,我只想找到朋友,或者只想找到家人,我想你明白我的意思。這個三路交叉表讓我很頭疼。@Clarification:我想要的是在我的用戶實體上定義的 @ManyToMany 關(guān)系,該實體恰好有額外的列。我知道在這種情況下有建議的解決方案,例如LINK。在我的例子中,這個額外的列是第三個表的外鍵(USER_INFO(保存用戶),CONNECTION_INFO(保存用戶之間的連接N:M +有關(guān)連接類型的信息),CONNECTION_TYPE。如果我可以用它來建模spring-data-jpa 據(jù)我了解,我只需要 UserRepository 下的一個神奇的命名方法,類似于(完全不正確):public interface UserRepository extends JpaRepository<User, Integer> {    List<User> findUserFriendsByConnectionType(User userWhoseFriendsWeAreSearching, String connectionTypeFromTheThirdTable);}這就是我想要的。我知道通過為交叉表創(chuàng)建一個實體并打破ManyToMany到OneToMany和ManyToOne,使用普通的額外列很簡單,碰巧我有第三個表和可能的ManyToOne(1個連接可以有1個關(guān)聯(lián)類型,而一個連接可以有1個關(guān)聯(lián)類型) type 可以鏈接到任意數(shù)量的連接)與 connection_type 表的交集實體上。我希望它能澄清一切。上面只是一個示例,我從未想過我們會掛在枚舉上,因為我想讓它看起來簡單,我可能讓它變得太簡單了:)。
查看完整描述

1 回答

?
慕工程0101907

TA貢獻1887條經(jīng)驗 獲得超5個贊

我設(shè)法解決了這個問題,但我不確定這是否是正確的方法。無論如何,這是我的解決方案。考慮以下 3 個表:


create table USER_INFO (

  USER_ID int not null primary key,

  USER_NAME varchar(16),

  PASSWORD varchar(64)

);


create table CONNECTION_TYPE (

  CONNECTION_TYPE_ID int not null primary key,

  CONNECTION_TYPE_NAME varchar(16) not null,

  CONNECTION_TYPE_DESCRIPTION varchar(128),

  unique (CONNECTION_TYPE_NAME)

);


create table CONNECTION (

  CONNECTION_ID int not null primary key,

  CONNECTION_TYPE_ID int,

  RELATED_USER_ID int,

  RELATING_USER_ID int,

  foreign key (CONNECTION_TYPE_ID) references CONNECTION_TYPE(CONNECTION_TYPE_ID),

  foreign key (RELATED_USER_ID) references USER_INFO(USER_ID),

  foreign key (RELATING_USER_ID) references USER_INFO(USER_ID)

通過上述 3 個表,我想提供一種功能來根據(jù)連接類型獲取任何給定用戶的連接。為此,我創(chuàng)建了 3 個實體,如下所示:


@Entity

@Table(name = "CONNECTION_TYPE")

public class ConnectionType implements Serializable {

  @Id

  @NotNull

  @Column(name = "CONNECTION_TYPE_ID")

  @GeneratedValue(strategy = GenerationType.IDENTITY)

  private Integer connectionTypeId;


  @NotNull

  @Column(name = "CONNECTION_TYPE_NAME", unique = true)

  private String connectionTypeName;


  @Column(name = "CONNECTION_TYPE_DESCRIPTION")

  private String connectionTypeDescription;


  ...

}

這里沒有什么特別有趣的地方,我省略了構(gòu)造函數(shù)、getter、setter 等,并且從 ConnectionType 中我不想為該類型的所有連接提供映射,因此不存在方向。


@Entity

@Table(name = "CONNECTION")

public class Connection implements Serializable {

  @Id

  @NotNull

  @Column(name = "CONNECTION_ID")

  @GeneratedValue(strategy = GenerationType.IDENTITY)

  private Integer connectionId;


  @NotNull

  @ManyToOne(fetch = FetchType.LAZY)

  @JoinColumn(name = "CONNECTION_TYPE_ID", referencedColumnName = "CONNECTION_TYPE_ID")

  private ConnectionType connectionType;


  @NotNull

  @ManyToOne(fetch = FetchType.LAZY)

  @JoinColumn(name = "RELATED_USER_ID", referencedColumnName = "USER_ID")

  private User relatedUser;


  @NotNull

  @ManyToOne(fetch = FetchType.LAZY)

  @JoinColumn(name = "RELATING_USER_ID", referencedColumnName = "USER_ID")

  private User relatingUser;


  ...

}

如果對其他人來說,至少對我而言,這更有趣。這將是我的交集表實體。對于使用的 ConnectionType 與 ManyToOne 存在單向映射,因為一個 Connection 只能具有一個 ConnectionType,而同一 ConnectionType 可以重復(fù)用于任意數(shù)量的 Connection。其他 2 個用戶映射我確信我已經(jīng)搞砸了,但在此之前這是用戶實體:


@Entity

@Table(name = "USER_INFO")

public class User implements Serializable {

  @Id

  @NotNull

  @Column(name = "USER_ID")

  @GeneratedValue(strategy = GenerationType.IDENTITY)

  private Integer userId;


  @NotNull

  @Column(name = "USER_NAME")

  private String userName;


  @NotNull

  @Column(name = "PASSWORD")

  private char[] password;


  @OneToMany(fetch = FetchType.LAZY, mappedBy = "relatedUser", cascade = CascadeType.ALL, orphanRemoval = true)

  private List<Connection> connections;

}

現(xiàn)在我更加確定我完全搞砸了,但我會顯示實際的錯誤。我的存儲庫很簡單:


@Repository

public interface UserRepository extends JpaRepository<User, Integer> {

}

我有一個帶有簡化的 findAllConnectionsForUserById 函數(shù)的 UserService :


@Service

public interface UserService {

    List<User> findAllConnectionsForUserById(Integer userId);

}

該方法的實現(xiàn)非常簡單:


@Override

@Transactional

public List<User> findAllConnectionsForUserById(Integer userId) {

    Optional<User> _user = userRepository.findById(userId);

    // omitted exception handling...

    User user = _user.get();

    List<Connection> connections = user.getConnections();


    return connections.strea.map(Connection::getRelatingUser).collect(Collectors.toList());

這樣,對于簡單的情況,它似乎工作得很好,并且如果我也采用 ConnectionType:


connections.stream().filter(c -> c.getConnectionType().getConnectionTypeName().equals("FRIEND")).map(Connection::getRelatingUser).collect(Collectors.toList());

它似乎也有效。同樣,不確定這是否是正確的方法,但至少它可以完成工作。


查看完整回答
反對 回復(fù) 2024-01-05
  • 1 回答
  • 0 關(guān)注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號