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

标签 java spring hibernate jpa

我在对对象属性进行存储库调用时遇到问题,该属性是多对多关系的一部分。

我试图让所有讲师分配到特定类(class)(为特定讲师获取所有类(class)效果很好)。但是当我从下面的存储库调用该方法时,我得到了 错误:

org.hibernate.TransientObjectException:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例: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<>();

    ...
}

类(class)

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

}

已编辑

类(class)服务方式

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

编辑2

全程类(class)服务方式

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

我尝试了一些方法,但无法使其发挥作用。你知道我为什么会遇到这种情况吗?我想这样做是因为我希望对类(class)的讲师进行分页。

谢谢。

最佳答案

尝试将 findAllByCourses 更改为 findAllByCoursesId,并将类(class) ID 作为参数。

如果从事务中调用

findAllByCourses 则完全没问题,并且 course 参数是托管实体。然而,在您的代码中,它是使用不受 JPA 管理的实体调用的(因为它是由 modelMapper.map(course, Course.class) 组装的,并且从未合并到持久性上下文中)。显然,JPA 不喜欢这样。

解决方案就是不使用将分离实体作为查询参数的查找方法。

关于Java Spring - ManyToMany 调用错误 - 对象引用未保存的 transient 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351528/

相关文章:

java - 创建实体后 Spring Hibernate 异常

java - 如何在junit @BeforeClass静态方法中访问spring ApplicationContext?

java - 为什么AutowiredAnnotationBeanPostProcessor支持@Value?

java - 无法创建 sessionFactory 对象.java.lang.NullPointerException

java - java中的排序点(2d,3d等)

java - 如果请求超过 1.5 秒,则不会显示 RichFaces 建议框

java - 使用池的 Spring LDAP 身份验证方法 - UnsupportedOperationException

Spring 3.0 MVC MVC :view-controller tag

java - Spring boot @Async 注解抛出 LazyInitializationException

java - MySQL更好的实践,一张大表或更好地划分为单独的表,使用Java hibernate