私は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;
}
}
おかげ
がある可能性がありますJPAとセキュリティを完全に機能SpringBootアプリケーションを実装しました? –
@SrikanthAもちろん!私の愚か者。私はそれを追加しました –