JPA Entity作为在Jax-RS中使用application / json的方法中的对象

时间:2014-07-18 06:50:41

标签: java json jax-rs

我的应用程序是根据对JaxRS服务的请求,使用JPA执行一些数据库操作。

以下是我用于JPA的实体类。

import javax.annotation.Generated; 
import javax.persistence.*;
import java.util.Date;

@Entity
public class Student  {

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

private int index;

@Column(length = 25)
private String name;

@Version
@Column(length = 45)
private Date timestamp;

public Student(int index, String name) {
    this.index = index;
    this.name = name;
}

public Student() {
}

public int getIndex() {
    return index;
}

public void setIndex(int index) {
    this.index = index;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

以下是我的JaxRS服务中的方法

@POST
@Path("add")
@Consumes("application/json")
public Response addStudent(Student student) {
    return null;
}

请暂时忽略return null;

在POST请求中,这需要有一个像以下一样的json对象,

'{"name":"Student 1", "index": 12, "id": "1", "timestamp" : "2014-07-21 12:19:12"}'

如何让json成为可能,

'{"name":"Student 1", "index": 12}'

2 个答案:

答案 0 :(得分:0)

我认为没有问题 - 参数student是一个新实例,id是自动生成的,您需要手动设置版本化时间戳列中的当前时间。有些实现甚至可以为你做最后一个。

答案 1 :(得分:0)

您可以添加将版本属性设置为当前时间戳的JPA @EntityListeners。一个小技巧是强制你的类实现一些可被EntityListener类识别的接口:这样,所有可版本化的类都会自动在@PrePersist和@PreUpdate事件上进行版本控制:

public interface IVersionable {
    public void setTimestamp(Date timestamp);
}

@Entity
@EntityListeners(MyEntityListener.class)
public class Student implements IVersionable  {
    // getters/setters omitted

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }
}

public class MyEntityListener {
    @PrePersist
    @PreUpdate
    public void prePersistUpdate(final Object entity) {
        if (entity instanceof IVersionable) {
            ((IVersionable) entity).setTimestamp(new Date());
        }
    }  
}