我被一個關于hibernate jpa n...m請求的問題所困擾。我的設定是這樣的:
我的設定是這樣的
ChatRoom <--> Participant
在映射表RoomParticipant中有一個額外的活動欄位:
在映射表RoomParticipant中有一個額外的活動欄位。
Room -> RoomParticipant <- Participant
id id
name roomId name
... participantId ...
活動
在做了一些教程和閱讀了大量的錯誤修復建議之后,我被這個設定困住了(利用Lombok):
public class Participant {
private String id;
private String name;
private List<RoomParticipant> rooms = new ArrayList<RoomParticipant> ()。
}
//class annotations omitted
public class RoomParticipant {
除了RoomParticipant,類的注釋都是一樣的。 現在,我有兩個函式呼叫:一個是打開一個新的房間,這個是有效的!
我有兩個函式呼叫。
public Room createRoom(String title, String userId, String username) {
Participant participant = participantRepository.findById(userId).orElse(createParticipant(userId, username))
Room room = new Room() 。
room.setTitle(title)。
room.addParticipant(participant);
room.setArchived(false)。
return chatRoomRepository.save(room)。
}
在呼叫這個函式后,一個新的房間已經被創建,一個新的參與者已經被創建,room_participant表已經被正確填寫。
但是現在我試圖用下面的函式加入一個房間:
public Room joinRoom(String roomId, String sessionId, String username){
Participant participant = participantRepository.findById(sessionId).orElse(createParticipant(sessionId,username))。
Room room = chatRoomRepository. findById(roomId).orElseThrow(() -> new InvalidRoomException(roomId)) 。
room.addParticipant(participant)。
return chatRoomRepository.save(room)。
由于以下錯誤,這并不奏效:
這兩個函式都呼叫了createParticipant,這是: 資源庫是單執行緒擴展JpaRepository uj5u.com熱心網友回復: 你沒有保存你的RoomParticipant,它是在 為了避免實作一個額外的 to
標籤:javaxRepository.save(room).
javax.persistence.EntityNotFoundException: Unable to find ...chatservice.model.entities.RoomParticipant with id ...chatservice.model.entities.RoomParticipantPK@cc9e297f private Participant createParticipant(String userId, String username) {
return participantRepository. save(new Participant(userId, username, new ArrayList<RoomParticipant> ())。
}
public interface ChatRoomRepository extends JpaRepository< Room, String> {}。
public interface ParticipantRepository extends JpaRepository<Participant, String>{}。
Room.addParticipant中創建的。RoomParticipantRepsitory,只需將Room.roomParticipants中的注釋改為 @OneToMany(mappedBy = "room")
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true)
