我不熟悉从Netbeans 8中的数据库自动生成REST服务代码。
免责声明:经过讨论(在评论中),我意识到我 如果你不熟悉这个问题,应该提醒你避免这个问题 在Netbeans中从DB自动生成REST服务 (https://netbeans.org/kb/docs/websvc/rest.html)。那是因为你 需要知道发生了什么以及在哪里举手 编辑它们。我这里不提供任何非工作代码,而是想知道我应该怎么做才能编辑这些服务。我提供了一个我想要获得的例子。
我从DB自动生成REST服务代码,并获得了实体类和服务“ facade ”类。我现在需要做的是扩展/编辑这些服务,我不知道该放在哪里。
例如,请考虑以下方案。我有一个学生,他/她通过了很多考试。从DB的角度来看,学生考试是1对多的关系。 当我测试其余的API并按学生的ID执行GET时,生成的JSON不包含与该学生相关的考试集合,如预期的那样。 我应该在哪里以及如何更改自动生成的服务代码,以便在学生的json中获取考试集合?
换句话说,假设我执行GET
../student/12
,我想要获得的是:
{
"id":12, "name":"Marco", "age":26, "exams": [
{ "id":1, "exam_name":"Computer Networks" },
{ "id":15, "exam_name":"Algorithms"}
]
}
祝你好运
答案 0 :(得分:0)
所以看起来我的工作正常,但我不知道这是否是最优雅的方式。
这就是我的所作所为。
1)转到自动生成的子实体类(即Exam.java
),并将自定义NamedQuery添加到NamedQueries注释中。例如,
@NamedQueries({
... default auto-generated stuff ...
@NamedQuery(name = "getExamsOfStudent", query="SELECT e FROM Exams e WHERE e.student.ID =: studentID")})
2)转到自动生成的子 REST服务类(即ExamFacadeREST.java
,并使用实体类中定义的NamedQuery添加一个方法来检索父项的子项。例如,
@GET
@Path("studentID/{studentID}")
@Produces({"application/xml","application/json"})
public List<Exam> getExamsOfStudent(@PathParam("studentID") Integer studentID) {
javax.persistence.Query query = getEntityManager().createNamedQuery("Exam.getExamsOfStudent");
query.setParameter("studentID", studentID);
return query.getResultList();
}
此时,您有一个REST服务,用于检索父实体的子项。
然而,这不是我最初要求的。在执行学生的GET(通过id)时,我想在学生JSON中检索考试作为集合。
为此,只需转到父实体REST服务(即StudentFacadeREST.java
)并正确编辑find
方法。
有谁知道更优雅的方式吗?
编辑1:我正在尝试第二种方法(将学生JSON中的考试作为集合检索,在执行学生的GET时),我看到了该集合没有序列化到输出JSON。对此有何建议?
编辑2:我明白了。对于&#34;一般延伸&#34;服务上面我答案的第一部分是好的。但是,如果要获取已在数据库中映射为关系的集合的序列化,只需正确删除实体自动生成的类中的相对@XmlTransient
注释。注意避免循环引用,也就是说,您可能需要添加 @XmlTransient
注释到&#34; getParent()&#34; 方法在子实体类中。
对于这个例子:
(A)转到Student
实体类并从@XmlTransient
方法中删除getExamsCollection()
注释;
(B)转到Exam
实体类,然后添加 @XmlTransient
注释到getStudent()
方法。
希望这有帮助。
祝你好运