1 回答

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());
它似乎也有效。同樣,不確定這是否是正確的方法,但至少它可以完成工作。
添加回答
舉報