Many-To-Many
関係の一部であるオブジェクトの属性へのリポジトリ呼び出しに問題があります。Java Spring - ManyToMany呼び出しエラー - オブジェクトは未保存の一時的インスタンスを参照します
私は特定のコースに割り当てられたすべての講師を取得しようとしています(特定の講師のすべてのコースをうまく機能させること)。 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;
...
}
講師リポジトリ
012:私は、次のような構成を持っています
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);
}
私はいくつかのことを試しましたが、動作させることはできません。なぜ私がこれに遭遇するのかあなたは何か考えていますか?私はコースの講師がページを変更したいので、これをしたいと思います。
ありがとうございます。
'findAllByCourses'を呼び出すコードを投稿できますか?また、多対多の関係で 'CascadeType.ALL'(' CascadeType.REMOVE'を意味する)を使用することを強くお勧めします。 – crizzis
あなたはCASCADE.ALLについて正しいです。ありがとうございました。そのメソッドのコードについては、Spring JPAによって生成されたため、投稿できません。クエリメソッド構文を使用し、そのメソッドに基づいてクエリをビルドします。私はCoursesRepositoryのために同様のaproachを使用しました。メソッドは正常に動作するので、関係やいくつかのアノテーションに問題があると思います。 –
私は実装ではなく、それを使用しているコードを意味しました – crizzis