2017-02-20 13 views
0

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

私はいくつかのことを試しましたが、動作させることはできません。なぜ私がこれに遭遇するのかあなたは何か考えていますか?私はコースの講師がページを変更したいので、これをしたいと思います。

ありがとうございます。

+0

'findAllByCourses'を呼び出すコードを投稿できますか?また、多対多の関係で 'CascadeType.ALL'(' CascadeType.REMOVE'を意味する)を使用することを強くお勧めします。 – crizzis

+0

あなたはCASCADE.ALLについて正しいです。ありがとうございました。そのメソッドのコードについては、Spring JPAによって生成されたため、投稿できません。クエリメソッド構文を使用し、そのメソッドに基づいてクエリをビルドします。私はCoursesRepositoryのために同様のaproachを使用しました。メソッドは正常に動作するので、関係やいくつかのアノテーションに問題があると思います。 –

+0

私は実装ではなく、それを使用しているコードを意味しました – crizzis

答えて

1

コースidをパラメータとしてfindAllByCoursesfindAllByCoursesIdに変更してみてください。

findAllByCoursesは、トランザクション内で呼び出された場合は完全に細かく、course引数は管理対象エンティティです。ただし、コードでは、JPAによって管理されていないエンティティ(modelMapper.map(course, Course.class)によってアセンブルされ、永続コンテキストにマージされないため)が呼び出されます。明らかに、JPAはそれを好まない。

解決策は、単にクエリパラメータとして分離されたエンティティを持つファインダメソッドを使用しないことです。

+0

どうもありがとう。 –

関連する問題

 関連する問題