2017-02-20 54 views
0

我有一个库调用对象的属性,它是一个Many-To-Many关系的一部分问题。Java的春天 - 多对多调用错误 - 对象引用一个未保存的瞬态的实例

我试图让分配给特定课程的讲师全部(让所有的课程特定讲师的作品非常好)。但是,当我打电话从仓库下面的方法我得到的 错误:

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

我已经尝试了一些东西,但我不能使它发挥作用。你知道我为什么遇到这个吗?我想这样做是因为我想要一个课程的讲师分页。

谢谢。

+0

你能张贴代码调用'findAllByCourses'?另外,我强烈建议不要在多对多关系中使用CascadeType.ALL(这意味着'CascadeType.REMOVE') – crizzis

+0

您对CASCADE.ALL是正确的。谢谢。关于该方法的代码,我不能发布它,因为它是由Spring JPA生成的。它使用它们的查询方法语法并基于该方法构建查询。我为CoursesRepository使用了类似的方法。该方法工作得很好,所以我认为这种关系或一些注释存在问题。 –

+0

我的意思是使用它的代码,而不是实现 – crizzis

回答

1

尝试改变findAllByCoursesfindAllByCoursesId与课程ID作为参数。

findAllByCourses如果从事务中调用并且参数course是托管实体,则将会非常好。然而,在你的代码中,它是用一个不由JPA管理的实体调用的(因为它由modelMapper.map(course, Course.class)组装,永远不会合并到持久化上下文中)。显然,JPA不喜欢这样。

解决方法是不使用取景器中的方法分离的实体作为查询参数。

+0

太棒了。非常感谢。 –

相关问题