不知道如何在Java DB中访问连接表

时间:2014-01-03 19:48:51

标签: java json web-services

我正在创建一个可以读取和写入JSON的Web服务,并且可以在不同的前端使用。 我有两个班,学生和课程。 我想讨论我在学生和课程之间的关系。 我在这两个班级之间建立了@ManyToMany关系,因为学生可以参加多个课程,多个学生可以参加一个课程。 在我的学生课上,我建立了这样的关系:

@ManyToMany
private List<Course> courses;

当然,我的课程课程也有同样的关系:

@ManyToMany(mappedBy = "courses")
private List<Student> students = new ArrayList<>();

这是(自动)映射到我的数据库,如下所示: 我有桌子

  • COURSE,它有自己的属性,如ID和NAME
  • STUDENT,它也有自己的属性,例如USERNAME,FIRSTNAME和LASTNAME
  • STUDENT_COURSE,它有外键ob课程COURSE和STUDENT将它们链接到彼此(COURSE_ID和STUDENT_USERNAME)

要从数据库POST和获取数据,我们为每个类使用“资源”类。 我将举例说明我为GET制作的学生课程以及有关学生的POST数据。我只会显示POST方法,因为这是与此事项最相关的方法

@Path("Students")
@Transactional
public class Students {
    @PersistenceContext
    private EntityManager em;

    @Resource
    private Validator validator;

    @Context
    private SecurityContext context;

    //GET, PUT and DELETE methods

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response addStudent(Student student) {
        Set<ConstraintViolation<Student>> violations = validator.validate(student);
        if (!violations.isEmpty()) {
            StringBuilder errorMessage;
            errorMessage = new StringBuilder();
            for (ConstraintViolation<Student> violation : violations) {
                if (errorMessage.length() != 0) {
                    errorMessage.append(", ");
                }
                errorMessage.append(violation.getMessage());
            }
            errorMessage.append(". ");
            return Response.status(Response.Status.BAD_REQUEST).entity("A new student must have a username, password, firstname and lastname. These fields cannot be empty." + errorMessage).build();
        }

        student.encryptPassword(); //this is a method in the Student class that encrypt the password and stores it in the DB this way for safety.
        student.addRole("student");
        em.persist(student);

        return Response.status(Response.Status.CREATED).location(URI.create("/" + student.getUsername())).build();
    }

这用于将使用JSON的对象POST到数据库。 我还有一个读取传入JSON的类。此类POST方法会自动选择此类,因为它会搜索我创建的每个JSONReader类,以查看哪个类可以读取传入的JSON。

这个JSONReader类看起来像这样:

@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class StudentReader implements MessageBodyReader<Student>
{
    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
    {
        return Student.class.isAssignableFrom(type);
    }

    @Override
    public StudentreadFrom(Class<Student> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException
    {
        JsonReader reader = Json.createReader(entityStream);
        JsonObject jsonStudent = reader.readObject();

        Student student = new Student();

        JsonString jsonString = jsonStudent.getJsonString("firstname");
        if (jsonString != null) {
            student.setFirstname(jsonString.getString());
        }

        JsonString jsonLastname = jsonStudent.getJsonString("lastname");
        if (jsonLastname != null)
        {
            student.setLastname(jsonLastname.getString());
        } 

        JsonString jsonUsername = jsonStudent.getJsonString("username");
        if (jsonUsername != null)
        {
            student.setUsername(jsonUsername.getString());
        }

        JsonString jsonPassword = jsonStudent.getJsonString("password");
        if (jsonPassword != null)
        {
            student.setPassword(jsonPassword.getString());
        }
    return student;
}

对不起长篇大论,但我很无奈。 我找不到任何使用这种方式创建Web服务的示例或API,也找不到任何关于如何访问具有ManyToMany关系但不是由java类创建的DB表的正确示例。

0 个答案:

没有答案