我是 Spring Boot 的 JPA 概念的新手,所以在決定如何匯入另一個物體的 ID 和另一個物體的 ArrayList 時需要你的幫助。我想創建一個板,提供一個帳戶的 ID 和帳戶 ID 的 ArrayList。以下是我的賬戶和董事會物體:
@Entity(name = "Account")
@Table(name = "account", uniqueConstraints = {@UniqueConstraint(name = "account_email_unique", columnNames = "email")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "account_id")
private Integer accountId;
@JsonIgnore
@OneToMany(targetEntity = Board.class, mappedBy = "boardOwnerId")
private Set<Board> boardSet = new HashSet<>();
@JsonIgnore
@ManyToMany(mappedBy = "boardMembers")
private Set<Board> boards = new HashSet<>();
@Entity(name = "Board")
@Table(name = "board", uniqueConstraints = {@UniqueConstraint(name = "board_name_unique", columnNames = "name")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "board_id")
private Integer boardId;
@ManyToOne(targetEntity = Account.class, cascade = CascadeType.ALL)
@JoinColumn(name = "account_id", referencedColumnName = "account_id")
private Account boardOwnerId;
@ManyToMany
@JoinTable(name = "board_member", joinColumns = @JoinColumn(name = "board_id"), inverseJoinColumns =
@JoinColumn(name = "account_id"))
private Set<Account> boardMembers = new HashSet<>();
@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> {
}
@RestController
@RequestMapping("/boards")
public class BoardController {
private final BoardService boardService;
@Autowired
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@PostMapping("/create-board")
ResponseEntity<BoardDtoResponse> createBoard(@Valid @RequestBody BoardDto boardDto) {
return new ResponseEntity<>(boardService.createBoard(boardDto), HttpStatus.CREATED);
}
}
@Service
public class BoardServiceImpl implements BoardService {
private final BoardRepository boardRepository;
private final ModelMapper modelMapper;
@Autowired
public BoardServiceImpl(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
modelMapper = new ModelMapper();
}
@Override
public BoardDtoResponse createBoard(BoardDto boardDto) {
Board boardToSave = modelMapper.map(boardDto, Board.class);
Board newBoard = boardRepository.save(boardToSave);
return modelMapper.map(newBoard, BoardDtoResponse.class);
}
}
我可以成功創建一個帳戶,但是當我想創建一個董事會并傳遞 boardOwnerId 和 membersIds 時,它會創建一個董事會,但是 boardOwnerId 和 membersIds 設定為 null。
這是通過郵遞員提出的請求:
在此先感謝您的時間!
uj5u.com熱心網友回復:
據我所見,您應該更改兩個映射的兩個物體之間的映射。讓我解釋:
- 對于板所有者 (@OneToMany) 的映射,請嘗試僅維護一個注釋并從 Board 物體中洗掉帶有 @ManyToOne 的屬性。此外,更改 @OneToMany 注釋的屬性值并添加具有下一個值的 @JoinColumn:
@Entity(name = "Account")
@Table(name = "account", uniqueConstraints = {@UniqueConstraint(name = "account_email_unique", columnNames = "email")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "account_id")
private Integer accountId;
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "boardOwnerId")
private Set<Board> boardSet = new HashSet<>();
...
@Entity(name = "Board")
@Table(name = "board", uniqueConstraints = {@UniqueConstraint(name = "board_name_unique", columnNames = "name")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "board_id")
private Integer boardId;
...
這稱為一對多單向映射 ( https://www.bezkoder.com/jpa-one-to-many-unidirectional/ )。
- 另一方面,您可以嘗試僅在 Board 物體上維護 @ManyToOne 注釋,但從具有下一個屬性值的 Account 物體中洗掉帶有 @OneToMany 注釋的屬性:
@Entity(name = "Account")
@Table(name = "account", uniqueConstraints = {@UniqueConstraint(name = "account_email_unique", columnNames = "email")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "account_id")
private Integer accountId;
...
@Entity(name = "Board")
@Table(name = "board", uniqueConstraints = {@UniqueConstraint(name = "board_name_unique", columnNames = "name")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "board_id")
private Integer boardId;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "account_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Account boardOwnerId;
...
這稱為默認的一對多映射 ( https://www.bezkoder.com/jpa-one-to-many/ )。
在任何情況下,您都會看到您只需為一對多映射實作兩種型別的注釋中的一種。
- 最后,對于 @ManyToMany 映射,嘗試下一個實作(添加 fetch 和 cascade 屬性值):
@Entity(name = "Account")
@Table(name = "account", uniqueConstraints = {@UniqueConstraint(name = "account_email_unique", columnNames = "email")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {
...
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
},
mappedBy = "boardMembers")
@JsonIgnore
private Set<Board> boards = new HashSet<>();
@Entity(name = "Board")
@Table(name = "board", uniqueConstraints = {@UniqueConstraint(name = "board_name_unique", columnNames = "name")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Board {
...
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "board_member", joinColumns = @JoinColumn(name = "board_id"), inverseJoinColumns =
@JoinColumn(name = "account_id"))
private Set<Account> boardMembers = new HashSet<>();
您可以在此處找到此實作設計:https ://www.bezkoder.com/jpa-many-to-many/
uj5u.com熱心網友回復:
問題是物體沒有與 dto 正確映射。解決方案是顯式映射加上 Gescof 的答案。
在這里我找到了關于顯式映射的資訊:ModelMapper mapping the wrong id
更改服務類中的代碼:
@Service
public class BoardServiceImpl implements BoardService {
private final BoardRepository boardRepository;
private final ModelMapper modelMapper;
@Autowired
public BoardServiceImpl(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
}
@Override
public BoardDtoResponse createBoard(BoardDto boardDto) {
Board boardToSave = modelMapper.map(boardDto, Board.class);
Board newBoard = boardRepository.save(boardToSave);
return modelMapper.map(newBoard, BoardDtoResponse.class);
}
}
物體類中的更改代碼:
@Entity(name = "Account")
@Table(name = "account", uniqueConstraints = {@UniqueConstraint(name = "account_email_unique", columnNames = "email")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "account_id")
private Integer accountId;
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
},
mappedBy = "boardMembers")
private Set<Board> boards = new HashSet<>();
@Entity(name = "Board")
@Table(name = "board", uniqueConstraints = {@UniqueConstraint(name = "board_name_unique", columnNames = "name")})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "board_id")
private Integer boardId;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "account_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Account boardOwnerId;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "board_member", joinColumns = @JoinColumn(name = "board_id"), inverseJoinColumns =
@JoinColumn(name = "account_id"))
private Set<Account> boardMembers = new HashSet<>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497254.html
