簡體   English   中英

更新將創建一個新的子對象,而不是更新現有的一個Hibernate對象

[英]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

  1. 從數據庫獲取Workout
  2. exercises集中更新一些Exercise
  3. 更新/合並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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM