gpt4 book ai didi

java - 更新创建新的子对象而不是更新现有的 Hibernate

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:02 25 4
gpt4 key购买 nike

在我的 Spring Boot 应用程序中,我有一个包含锻炼对象列表的锻炼对象。问题是当我尝试更新锻炼时,属于锻炼的锻炼没有被更新。相反,它在数据库中创建新的练习对象。我在下面添加了我的锻炼实体和锻炼实体。任何帮助将不胜感激。

锻炼类(class):

@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;
}
}

练习类(class):

@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 :

@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 ( what is @JoinColumn and how it is used in Hibernate )。

@OneToMany(mappedBy = "workout", cascade = CascadeType.ALL)
private List<Exercise> exercises;

@ManyToOne
@JoinColumn(name = "workout_id")
private Workout workout;

如果您希望在 Exercise 行不属于 Workout 时将其删除,请使用 orphanRemoval = true

@OneToMany(mappedBy = "workout", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Exercise> exercises;

从数据库更新锻炼

  1. 从数据库获取锻炼
  2. 练习集合中更新一些练习
  3. 更新/合并锻炼

从数据库更新练习

您可以通过Workout id获取一组练习(不含Workout)。更新它们中的任何一个并saveOrUpdate它们中的每一个。

根据请求更新锻炼

您应该在锻炼中有ID。此外,每个具有现有 idExercise 都将被更新(并且将使用不存在的 id 创建,至少对于 Hibernate 4.11),每个没有 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;
}

您需要关闭 session ,这是垃圾Hibernate.initialize(Workout.class)

关于java - 更新创建新的子对象而不是更新现有的 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47492600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com