Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpring-ManyToMany调用错误-对象引用未保存的临时实例_Java_Spring_Hibernate_Jpa - Fatal编程技术网

JavaSpring-ManyToMany调用错误-对象引用未保存的临时实例

JavaSpring-ManyToMany调用错误-对象引用未保存的临时实例,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我对对象属性的存储库调用有问题,该属性是多对多关系的一部分 我试图让所有的讲师都被分配到一个特定的课程(为一个特定的讲师安排所有的课程效果很好)。但是当我从下面的存储库调用该方法时,我得到 错误: org.hibernate.transientObject异常:对象引用未保存的临时实例-刷新前保存临时实例:app.model.Course 为关系的两个部分都设置了级联类型 我有以下配置: 讲师 @Entity @Table(name = "LECTURERS") @Inheritance(str

我对对象属性的存储库调用有问题,该属性是多对多关系的一部分

我试图让所有的讲师都被分配到一个特定的课程(为一个特定的讲师安排所有的课程效果很好)。但是当我从下面的存储库调用该方法时,我得到 错误:

org.hibernate.transientObject异常:对象引用未保存的临时实例-刷新前保存临时实例:app.model.Course

为关系的两个部分都设置了
级联类型

我有以下配置:

讲师

@Entity
@Table(name = "LECTURERS")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Lecturer extends AbstractUser {

    @ManyToMany(fetch = FetchType.EAGER, targetEntity = Course.class, cascade = CascadeType.ALL)
    @Fetch(FetchMode.SELECT)
    @JoinTable(name = "COURSE_OWNERSHIPS",
            joinColumns = {@JoinColumn(name = "lecturer_id")},
            inverseJoinColumns = {@JoinColumn(name = "course_id")})
    @JsonSerialize(using = CustomCourseListSerializer.class)
    private List<Course> courses = new ArrayList<>();

    ...
}
@实体
@表(name=“讲师”)
@继承(策略=继承类型。每个类的表)
公共类讲师扩展抽象用户{
@ManyToMany(fetch=FetchType.EAGER,targetEntity=Course.class,cascade=CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinTable(name=“课程所有权”,
joinColumns={@JoinColumn(name=“讲师_id”)},
inverseJoinColumns={@JoinColumn(name=“course\u id”)})
@JsonSerialize(使用=CustomCourseListSerializer.class)
私有列表课程=新的ArrayList();
...
}
课程

@Entity
@Table(name = "COURSES")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Course implements Item, Serializable {

    ...

    @ManyToMany(mappedBy = "courses", fetch = FetchType.EAGER, targetEntity = Lecturer.class, cascade = CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonSerialize(using = CustomLecturerListSerializer.class)
    private List<Lecturer> lecturers;

    ...
}
@实体
@表(name=“COURSES”)
@JsonIdentityInfo(
生成器=ObjectedGenerators.PropertyGenerator.class,
property=“id”)
公共类课程实现项,可序列化{
...
@ManyToMany(mappedBy=“courses”,fetch=FetchType.EAGER,targetEntity=讲师.class,cascade=CascadeType.ALL)
@Fetch(值=FetchMode.SUBSELECT)
@JsonSerialize(使用=Custom讲师ListSerializer.class)
私人名单讲师;
...
}
讲师库

public interface LecturerRepository extends PagingAndSortingRepository<Lecturer, Long> {

    ...

    Page<Lecturer> findAllByCourses(Course course, Pageable pageable);

}
公共接口讲师存储库扩展了分页和排序存储库{
...
页面findAllByCourses(课程,可分页);
}
已编辑

@Override
    public Page<Lecturer> getLecturers(Course course, int page) {
        return lecturers.findAllByCourses(course, new PageRequest(page, 10));
    }
  @Override
    public Page<LecturerDto> getLecturers(CourseDto course, int page) {
        Type listType = new TypeToken<Page<LecturerDto>>() {}.getType();
        return modelMapper.map(lecturers.findAllByCourses(modelMapper.map(course, Course.class), new PageRequest(page, 10)), listType);
    }
课程服务方式

@Override
    public Page<Lecturer> getLecturers(Course course, int page) {
        return lecturers.findAllByCourses(course, new PageRequest(page, 10));
    }
  @Override
    public Page<LecturerDto> getLecturers(CourseDto course, int page) {
        Type listType = new TypeToken<Page<LecturerDto>>() {}.getType();
        return modelMapper.map(lecturers.findAllByCourses(modelMapper.map(course, Course.class), new PageRequest(page, 10)), listType);
    }
@覆盖
公共页面获取讲师(课程,内部页面){
返回讲师。findAllByCourses(课程,新页面请求(第10页));
}
编辑2

全程服务方式

@Override
    public Page<Lecturer> getLecturers(Course course, int page) {
        return lecturers.findAllByCourses(course, new PageRequest(page, 10));
    }
  @Override
    public Page<LecturerDto> getLecturers(CourseDto course, int page) {
        Type listType = new TypeToken<Page<LecturerDto>>() {}.getType();
        return modelMapper.map(lecturers.findAllByCourses(modelMapper.map(course, Course.class), new PageRequest(page, 10)), listType);
    }
@覆盖
公共页面获取讲师(课程到课程,内部页面){
类型listType=newTypeToken(){}.getType();
返回modelMapper.map(讲师.findAllByCourses(modelMapper.map(course,course.class)),newpagerequest(page,10)),listType;
}
我试过几件事,但都没成功。你知道我为什么会遇到这种情况吗?我想这样做是因为我想让一门课程的讲师分页


谢谢。

尝试将
findAllByCourses
更改为
findallbycourseId
,并将课程id作为参数

findAllByCourses
如果从事务中调用,并且
course
参数为托管实体,则可以完全正常使用。但是,在您的代码中,它是用一个不由JPA管理的实体调用的(因为它是由
modelMapper.map(course,course.class)
组装的,并且从未合并到持久性上下文中)。显然,JPA不喜欢这样


解决方案就是不使用带有分离实体的finder方法作为查询参数

你能发布调用findAllByCourses的代码吗?另外,我强烈建议不要在多对多关系中使用
CascadeType.ALL
(这意味着
CascadeType.REMOVE
)您对CASCADE.ALL的看法是正确的。非常感谢。关于该方法的代码,我无法发布,因为它是由SpringJPA生成的。它使用它们的查询方法语法并基于该方法构建查询。我在课程记忆中也使用了类似的方法。这个方法工作得很好,所以我认为这个关系或一些注释有问题。我是指使用它的代码,而不是实现我的错,我误读了它。我用呼叫代码编辑了这篇文章。这只是一个返回讲师特定页面的服务方法。这可能不太可能,但我会尝试将
findAllByCourses
更改为
findallbycourseId
,并将课程id作为参数。谢谢。