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作为参数。谢谢。