2017-01-18 15 views
1

私はSpring(REST)の新機能で、簡単なREST Webサービスを構築しています。私はRestControllerを使ってHTTPリクエストをマッピングします。私は、POSTリクエストを受け付けるため、この単純な方法を使用します。この場合、Spring:POSTリクエストで外部キーを持つオブジェクトを保存する

@RequestMapping(value = "/grade/create", method = RequestMethod.POST) 
public ResponseEntity<Grade> createGrade(@RequestBody Grade grade) 
{ 
    dao.createGrade(grade); 

    return new ResponseEntity<Grade>(grade, HttpStatus.OK); 
} 

dao@Repository注釈付きクラスです。要求寿、次のようになりdは:

{ 
    "gradeType": "REGULAR", 
    "grade": "10", 
    "passed": 1, 
    "userId": 1, 
    "exam_id": 1, 
    "user_id": 3 
} 

問題はGradeは、ユーザーおよび試験の2つの外部キーを持っていること、です。私は、外国のエンティティのIDを渡して休止状態にすることができるようにしたい。しかし現在、私はこれを応答として受け取ります:

{ 
    "timestamp": 1484758525821, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "org.springframework.dao.InvalidDataAccessResourceUsageException", 
    "message": "could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement", 
    "path": "/grade/create" 
} 

どうすればこの問題を解決できますか? JpaRepositoryについて聞いたことがありますが、これを達成するために使用できますか?次のように

Gradeモーダルです:

@Entity 
@Table(name = "grades") 
@NamedQueries(value = { 
     @NamedQuery(name = "Grade.get", query = "SELECT c FROM Grade c WHERE id = :id"), 
     @NamedQuery(name = "Grade.getAll", query = "SELECT c FROM Grade c"), 
     @NamedQuery(name = "Grade.getAllByUser", query = "SELECT g FROM Grade g INNER JOIN Exam e ON g.exam.id = e.id INNER JOIN Course c ON e.course.id = c.id WHERE g.user.id = :id"), 

}) 
public class Grade { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @Column(name = "type") 
    private String gradeType; 

    @Column(name = "grade") 
    private String grade; 

    @Column(name = "passed") 
    private int passed; 

    @JsonIgnore 
    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "exam_id") 
    private Exam exam; 

    private int examId; 

    private int userId; 

    public Grade(int id, String gradeType, String grade, int passed, User user, Exam exam) 
    { 
     setId(id); 
     setGradeType(gradeType); 
     setGrade(grade); 
     setPassed(passed); 
     setUser(user); 
     setExam(exam); 
    } 

    public Grade() { 
    } 

そして、私のリポジトリ...

@Repository 
public class GradeDao { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional 
    public List<Grade> getallGrades() { 
     return em.createNamedQuery("Grade.getAll", Grade.class) 
       .getResultList(); 
    } 

    public List<Grade> getLimitedGradesByUser(int limit, int user_id) { 
     return em.createNamedQuery("Grade.getAllByUser", Grade.class) 
       .setParameter("id", user_id) 
       .setMaxResults(limit) 
       .getResultList(); 
    } 

    @Transactional 
    public Grade getGrade(int id) { 
     return em.createNamedQuery("Grade.get", Grade.class).setParameter("id", id).getSingleResult(); 
    } 

    @Transactional 
    public Grade createGrade(Grade grade) { 
     grade = em.merge(grade); 
     em.persist(grade); 

     return grade; 
    } 
} 

おかげ

+0

がある可能性がありますJPAとセキュリティを完全に機能SpringBootアプリケーションを実装しました? –

+0

@SrikanthAもちろん!私の愚か者。私はそれを追加しました –

答えて

1

がどのように私はこの問題を解決することができますか?私はJpaRepositoryについて何か聞いたことがありますが、これを達成するためにそれを使用できますか?

はい、これはJpaRepositoryで行うことができます。あなたがPOSTあなたのコントローラでのごGrade(私はそのためのServiceを示唆している)
1.リンクにnew Grade()
2. settersを作成するときは、次にUserExam
ためInterface
public interface GradeRepository extends PagingAndSortingRepository<Grade, Long>、同じの追加を開始することができますあなたのUserRepositoryExamRepositoryとその後、あなたのからあなたの他のフィールドをフェッチ
3. findByIdを呼び出すことを-ing @AutowireによってあなたのUserとあなた@AutowiredGradeRepository

からsetters
4.コール.save(grade)UserExamが既にできリンクするDBでそれらを存在する必要があることに注意してください

また、私は非常にあなたが経由で直接エンティティを渡すことはありませんすることをお勧めしますを使用してHTTP代わりにDTOsを使用し、Gradejsonではexam idを決して通過しないでください。他の分野での試験を見つけてみてください、ないtable id(例:findByName)

私は、あなたが同様にあなたのリポジトリクラスを追加してくださいすることができ一見https://github.com/hodispk/internship

+0

ありがとう、これはすでに大規模なヘルプです。私はレポの紹介を私のコントローラにしようとしましたが、私はこの問題です: 説明: HvA.Controllers.GradeControllerのフィールドグレードリポジトリには、タイプHvA.Repositories.GradeRepositoryのBeanが見つかりませんでした。 アクション: 設定で 'HvA.Repositories.GradeRepository'タイプのBeanを定義することを検討してください。 –

+0

'@ComponentScan(" com.pkg.repos ")'があなたの 'repos'であることを確認してください。あなたは '@EnableJpaRepository(" com.pkg.repos ")'もする必要があります。 –

+0

どのファイルですか?私の主なApplication.java? –

関連する問題