Java Spring - ManyToMany调用错误 - 对象引用未保存的瞬态实例

时间:2017-02-20 18:07:35

标签: java spring hibernate jpa

我对对象属性的存储库调用存在问题,该属性是Many-To-Many关系的一部分。

我正在努力让所有讲师分配到特定课程(让特定讲师的所有课程都能很好地运作)。但是当我从下面的存储库调用该方法时,我得到了 错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: app.model.Course

为关系的两个部分设置了CascadeType

我有以下配置:

讲师

@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<>();

    ...
}

课程

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

    ...
}

讲师信息库

public interface LecturerRepository extends PagingAndSortingRepository<Lecturer, Long> {

    ...

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

}

被修改

课程服务方法

@Override
    public Page<Lecturer> getLecturers(Course course, int page) {
        return lecturers.findAllByCourses(course, new PageRequest(page, 10));
    }

修改2

全程服务方法

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

我尝试了一些事情,但我无法使其发挥作用。你知道我为什么遇到这个吗?我想这样做是因为我希望课程的讲师分页。

谢谢。

1 个答案:

答案 0 :(得分:1)

尝试将课程ID作为参数更改为findAllByCoursesfindAllByCoursesId

如果从事务中调用,并且findAllByCourses参数是一个被管实体,那么

course就完全可以了。但是,在您的代码中,使用不由JPA管理的实体调用它(因为它由modelMapper.map(course, Course.class)汇编而不会合并到持久性上下文中)。显然,JPA并不喜欢这样。

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