![](/img/trans.png)
[英]Using saveOrUpdate() in Hibernate creates new records instead of updating existing ones
[英]Updating creates new child object instead of updating the existing one Hibernate
在我的春季啟動應用中,我有一個帶有鍛煉對象列表的“鍛煉”對象。 問題是當我嘗試更新鍛煉時,屬於鍛煉的練習未得到更新。 相反,它正在數據庫中創建新的Exercise對象。 我在下面添加了鍛煉實體和運動實體。 任何幫助將不勝感激。
鍛煉班:
@Entity
public class Workout {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "workout_id")
private List<Exercise> exercises;
public Workout(List<Exercise> exercises) {
this.exercises = exercises;
}
public Workout() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<Exercise> getExercises() {
return exercises;
}
public void setExercises(List<Exercise> exercises) {
this.exercises = exercises;
}
}
練習課:
@Entity
@Table
public class Exercise {
@Id
@GeneratedValue
private Long id;
private String exerciseName;
private int weight;
private int actualReps;
@ManyToOne
@JoinColumn(name = "workout_id")
private Workout workout;
public Exercise(){}
public Exercise( String exerciseName, int weight, int actualReps) {
this.exerciseName = exerciseName;
this.weight = weight;
this.actualReps = actualReps;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getExerciseName() {
return exerciseName;
}
public void setExerciseName(String exerciseName) {
this.exerciseName = exerciseName;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getActualReps() {
return actualReps;
}
public void setActualReps(int actualReps) {
this.actualReps = actualReps;
}
}
控制器:
@Controller
public class WorkoutController {
@Autowired
private WorkoutService workoutService;
@Autowired
private OneRepMaxService oneRepMaxService;
@Autowired
private ActualRepsService actualRepsService;
@Autowired
private PercentageService percentageService;
@Autowired
private ExerciseService exerciseService;
@RequestMapping("/")
@SuppressWarnings("unchecked")
public String showWorkout(Long id, Model model,Workout workout){
Workout firstWorkout = workoutService.findById(Long.valueOf(83));
model.addAttribute("firstWorkout",firstWorkout);
model.addAttribute("workout",workout);
return "workout";
}
@RequestMapping(value="/workoutLogs", method = RequestMethod.POST)
public String saveWorkout(@ModelAttribute Workout workout,Model model) {
workoutService.saveNewWorkout(workout);
return "redirect:/workoutLogs";
}
@RequestMapping("/workoutLogs")
public String showAllSavedWorkoutLogs(Model model){
return "WorkoutLogs";
}
}
鍛煉道:
@Repository
public class WorkoutDaoImpl implements WorkoutDao {
@Autowired
SessionFactory sessionFactory;
@Override
@SuppressWarnings("unchecked")
public List<Workout> findAll() {
Session session = sessionFactory.openSession();
List<Workout> workouts = session.createCriteria(Workout.class).list();
session.close();
return workouts;
}
@Override
public Workout getFirstWorkoutExerciseName(Long id) {
return null;
}
@Override
public Workout getWorkout() {
return null;
}
@Override
public Workout findById(Long id) {
Session session = sessionFactory.openSession();
Workout workout = session.get(Workout.class,id);
Hibernate.initialize(Workout.class);
return workout;
}
@Override
public void save(Workout workout) {
Session session = sessionFactory.openSession();
// Begin a transaction
session.beginTransaction();
// Save the category
session.saveOrUpdate(workout);
// Commit the transaction
session.getTransaction().commit();
// Close the session
session.close();
}
@Override
public void delete(Workout workout) {
}
}
使用mappedBy
的雙向關聯,並且不使用@JoinColumn
對每個關聯方( 什么是@JoinColumn以及它是如何在Hibernate中使用 )。
@OneToMany(mappedBy = "workout", cascade = CascadeType.ALL)
private List<Exercise> exercises;
@ManyToOne
@JoinColumn(name = "workout_id")
private Workout workout;
如果您要在不屬於Workout
Exercise
行被刪除時使用orphanRemoval = true
@OneToMany(mappedBy = "workout", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Exercise> exercises;
從數據庫更新Workout
Workout
。 exercises
集中更新一些Exercise
。 Workout
從數據庫更新exercises
您可以通過“ Workout
ID”獲得Workout
的集合(不包含“ Workout
)。 而更新任何他們與saveOrUpdate
他們每個人。
從請求更新Workout
您應該在“ Workout
具有ID。 同樣,將更新每個具有現有id
Exercise
(並至少在Hibernate 4.11中使用不存在的id
創建),將創建每個不具有ID的Exercise
,每個不包含在exercises
集合中的Exercise
都將使用orphanRemoval = true
刪除。
對於這種情況,請始終使用merge()
, saveOrUpdate()
無效(至少不會刪除練習)。
這是不正確的方法:
@Override
public Workout findById(Long id) {
Session session = sessionFactory.openSession();
Workout workout = session.get(Workout.class,id);
Hibernate.initialize(Workout.class);
return workout;
}
您需要關閉一個會話,這是垃圾Hibernate.initialize(Workout.class)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.