微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Repository.save() 不会持久化 CascadeType = all 的实体

如何解决Repository.save() 不会持久化 CascadeType = all 的实体

我想向我们数据库中的实体添加级联。我添加@OnetoMany(mappedBy = "exercise",cascade = CascadeType.ALL,fetch = FetchType.EAGER) 到父关系来测试它是如何工作的。 但是,当我保存父实体时,子实体似乎根本没有被保存。 在网上搜索答案时,我发现 session 显然有保存和/或持久化实体的方法。问题是我对会话的工作方式感到完全困惑,并且没有任何尝试成功。我的问题是,级联是否适用于 repository.save()?如果没有,最好的方法是什么?提前致谢。

父实体:

@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Module {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Builder.Default
    @OnetoMany(mappedBy = "module",fetch = FetchType.EAGER,orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonBackReference
    private List<Exercise> exercises = new ArrayList<>();
    
    public void saveExercise(Exercise exercise) {
        int index = exercises.indexOf(exercise);
        if (index == -1) {
            exercises.add(exercise);
        } else {
            exercises.set(index,exercise);
        }
    }
    // methods
}

子实体

@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Exercise {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    @ManyToOne
    @JsonManagedReference
    private Module module;
    
    // methods
}

模块服务

@Transactional
@Service
public class ModuleService {

public void saveModule(Module module) {
        moduleRepository.save(module);
    }
}

运动服务:

@Transactional
@Service
public class ExerciseService {
    public void saveExercise(Exercise exercise) {
        // Get parent in relationship
        Module module = exercise.getModule();

        // Update parent
        module.saveExercise(exercise);

        // Save parent
        moduleService.saveModule(module);
    }
    public Exercise getExerciseById(Long exerciseId) {
        return exerciseRepository.findById(exerciseId).orElseThrow();
    }

}

测试:

    @Test
    public void testSaveDeleteExercise() {
        Exercise exercise = Exercise.builder().id(101L).module(module).build();

        exerciseService.saveExercise(exercise);

        assertthat(exerciseService.getExerciseById(exercise.getId())).isEqualTo(exercise);
}

例外:

java.util.NoSuchElementException: No value present

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?