我有一些模型在這個物件中相互關聯,我試圖從資料庫中保存和獲取,但我似乎無法讓它正常作業。該物件包含一個屬性,該屬性還包含另一個物件。我的方法是保存到所有相關模型,對于這些模型,我還將這個當前模型保存到它們,以便它顯示資料庫表上的關系。
在應用程式的模型下方。
@Entity
@Table(name = "daily_entry")
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class DailyEntry {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "daily_entry_id", unique = true)
private Long id;
@Column(unique = true)
private LocalDate date;
private int weight;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "daily_macros_id", unique = true)
private DailyMacros dailyMacros;
@OneToMany(mappedBy = "dailyEntry", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Exercise> exercise = new ArrayList<Exercise>();
}
@Entity
@Table(name = "daily_macros")
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class DailyMacros {
@Id
@GeneratedValue
@Column(name = "daily_macros_id")
private Long id;
private int calories;
private int protein;
private int fat;
private int carbs;
@OneToOne(mappedBy = "dailyMacros", cascade = CascadeType.ALL, orphanRemoval = true)
private DailyEntry dailyEntry;
}
@Setter
@Getter
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name= "exercises")
public class Exercise {
@Id
@GeneratedValue
@Column(name = "exercise_id")
private Long id;
private String name;
private int sets;
private int reps;
private int weight;
@ManyToOne
@JoinColumn(name = "daily_entry_id", unique = true)
private DailyEntry dailyEntry;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
private String role = "user";
private String token;
@Column(unique = true, nullable = false)
protected String username;
@Column(unique = true ,nullable = false)
private String emailAddress;
@Column(nullable = false)
private String password;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "macros_goal_id")
private MacrosGoal macrosGoal;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<DailyEntry> dailyEntry = new ArrayList<>();
}
我正在嘗試將 DailyEntry 的模型保存到資料庫中。用戶是 DailyEntry 的所有者 DailyEntry 擁有 MacrosGoal (@OneToOne) 和鍛煉 (@OneToMany)。我怎樣才能將這個模型保存并提取到資料庫中?
這是我嘗試過的 - 對于我的 PutMapping,我收到此錯誤:在提交回應后無法呼叫 sendError()
盡管 http 狀態代碼為 200,但我的 GetMapping 只回傳一個空回應
DailyEntryController 檔案
@RequestMapping(path = "/api/v1/")
@RequiredArgsConstructor
public class DailyEntryController {
@Autowired
DailyEntryService dailyEntryService;
@GetMapping("/getDailyEntry")
public ResponseEntity<DailyEntry> getDailyEntry(@RequestParam("username") String username, @RequestParam String date) throws ResponseStatusException {
DailyEntry dailyEntry = dailyEntryService.getDailyEntry(username, date);
return new ResponseEntity<>(dailyEntry, HttpStatus.OK);
}
@PutMapping("/addDailyEntry")
public ResponseEntity<DailyEntry> addDailyEntry(@RequestBody DailyEntry dailyEntry, @RequestParam("username") String username) throws ResponseStatusException {
DailyEntry dailyEntryInfo = dailyEntryService.createDailyEntry(dailyEntry, username);
return new ResponseEntity<>( dailyEntryInfo, HttpStatus.OK);
}
}
@Slf4j
@Service
public class DailyEntryServiceImpl implements DailyEntryService {
@Autowired
DailyEntryRepository dailyEntryRepository;
@Autowired
ExerciseRepository exerciseRepository;
@Autowired
UserRepository userRepository;
@Autowired
DailyMacrosRepository dailyMacrosRepository;
@Override
public DailyEntry addExercise(Exercise exercise) {
return null;
}
@Override
public DailyEntry getDailyEntry(String username, String date) {
DailyEntry entry = null;
Optional<User> userFromDatabase = userRepository.findByUsername(username);
User user = userFromDatabase.get();
LocalDate localDate = LocalDate.parse(date);
List<DailyEntry> dailyEntryList = user.getDailyEntry();
for(DailyEntry e : dailyEntryList) {
if(e.getDate() == localDate){
entry = e;
}
}
return entry;
}
@Override
public DailyEntry createDailyEntry(DailyEntry dailyEntry, String username) {
DailyEntry entry = new DailyEntry();
// Find user
Optional<User> userFromDatabase = userRepository.findByUsername(username);
User user = userFromDatabase.get();
entry.setUser(user);
entry.setDate(LocalDate.parse(dailyEntry.getDate().toString()));
entry.setDailyMacros(dailyEntry.getDailyMacros());
entry.setWeight(dailyEntry.getWeight());
entry.setExercise(dailyEntry.getExercise());
DailyMacros dailyMacros = dailyEntry.getDailyMacros();
dailyMacros.setDailyEntry(entry);
dailyMacrosRepository.save(dailyMacros);
List<Exercise> exercise = dailyEntry.getExercise();
for (Exercise e : exercise) {
e.setDailyEntry(entry);
exerciseRepository.save(e);
}
List<DailyEntry> dailyEntryList = user.getDailyEntry();
dailyEntryList.add(entry);
user.setDailyEntry(dailyEntryList);
userRepository.save(user);
return entry;
}
我也嘗試在存盤庫中使用 Query,但我可能做錯了。
uj5u.com熱心網友回復:
您可能應該添加@Transactional到createDailyEntry. 我真的不明白發生了什么,createDailyEntry但我認為它應該看起來像這樣:
@Override
@Transactional
public DailyEntry createDailyEntry(DailyEntry dailyEntry, String username) {
User user = userRepository
.findByUsername(username)
.get();
dailyEntryRepository.save(dailyEntry);
user.getDailyEntry().add(dailyEntry);
dailyEntry.setUser(User);
DailyMacros dailyMacros = dailyEntry.getDailyMacros();
dailyMacros.setDailyEntry(dailyEntry);
dailyMacrosRepository.save(dailyMacros);
dailyEntry.getExcercise()
.forEach( e -> {
e.setDailyEntry(dailyEntry);
exerciseRepository.save(e);
});
// I don't think you need this because user is already managed
// and userFromDatabase.get() will throw an exception
// if the user does not exist.
// userRepository.save(user);
return dailyEntry;
}
我認為getDailyEntry這行不通,因為您正在使用e.getDate() == localDate它,而且它總是會如此false。
一種解決方案是向 DailyEntryRepository 添加一個接受username和的方法date:
interface DailyEntryRepository extends JpaRepository<DailyEntry, Long> {
@Query("select de from DailyEntry de where de.user.username = :username and de.date = :localDate")
DailyEntry findByUsernameAndDate(@Param("username") String username, @Param("localDate") LocalDate date);
}
...
@Override
public DailyEntry getDailyEntry(String username, String date) {
LocalDate localDate = LocalDate.parse(date);
return dailyEntryRepository.findByUsernameAndDate(username, localdate);
}
此解決方案將運行查詢并僅加載您需要的條目。
但是,如果您需要驗證用戶名,這應該可以作業:
@Override
public DailyEntry getDailyEntry(String username, String date) {
User user = userRepository
.findByUsername(username)
.get();
LocalDate localDate = LocalDate.parse(date);
for(DailyEntry e : user.getDailyEntry()) {
if (localDate.equals(e.getDate)){
// No need to continue the loop, you've found the entry
return entry;
}
}
// daily entry not found
return null;
}
缺少的另一件事是,在您的模型中,您在轉換為 JSON 期間沒有處理雙向關聯。解決方案是使用我最終使用的@JsonManagedReference和@JsonBackReference你有關聯的地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/524155.html
標籤:mysql春天休眠
