Spring,Creation和lastUpdate返回null

时间:2014-10-28 20:10:25

标签: spring hibernate jpa

我对PUT请求的响应有一些问题。所有更改都会保留并返回除以下两个字段之外的所有数据:“created”:“null”,“lastUpdated”:“null”。我不明白为什么我在这里得到一个空虚。

在POST上,一切正常,正如预期的那样,所有数据都包含在响应中,包括两个有问题的字段:“created”:“2014-10-28T19:55:37.889Z”,“lastUpdated”:“2014 -10-28T19:55:37.889Z“

我的实体如下所示:

@Entity
@Table(name = "projects")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Project extends AbstractPersistable {

private String key;
private String name;
private String description;

@Column(name = "created_date", nullable = false, updatable = false)
@JsonSerialize(using = DateTimeSerializer.class)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime created;

@Column(name = "last_updated_date", nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime lastUpdated;

@PrePersist
public void onPersist() {
    this.created = new DateTime();
    this.lastUpdated = new DateTime();
}


@PreUpdate
public void onUpdate() {
    this.lastUpdated = new DateTime();
}

//Getter and setter methods

这是我的资源类

@Path("/")
@Component
public class ProjectsResource {

@Autowired
private ProjectService projectService;

@POST
@Path("projects")
@Consumes(CustomMediaTypes.SMARTGWT_JSON)
@Produces(CustomMediaTypes.SMARTGWT_JSON)
public Response create(Project project) throws ServiceException {
    projectService.createOrSave(project);
    ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer();
    jsonSerializer.visit(project);
    return     Response.status(Response.Status.CREATED).entity(jsonSerializer.asServiceResponse("success")).build();
}

@PUT
@Path("projects")
@Consumes(CustomMediaTypes.SMARTGWT_JSON)
@Produces(CustomMediaTypes.SMARTGWT_JSON)
public Object update(Project project) throws ServiceException {
    projectService.createOrSave(project);

    ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer();
    jsonSerializer.visit(project);
    return Response.status(Response.Status.CREATED).entity(jsonSerializer.asServiceResponse("success")).build();
}

1 个答案:

答案 0 :(得分:0)

我猜你用作参数的项目实例不是由Persistence Context管理的。

如果在createOrSave方法中调用javax.persistence.EntityManager #incin,则不会管理作为参数提供的实体实例。因此,您无法从数据库中看到任何更改(如创建日期或上次更新日期)。

但是,javax.persistence.EntityManager#merge创建并返回实体的新实例,复制此实体状态,并使用创建日期或上次更新日期管理此新实例。

因此,方法projectService.createOrSave(project)应该返回对托管对象的引用:

Project createOrSave(Project project)

您可以传递给json序列化程序的参考。

javax.persistence.EntityManager #persist将您提供的(新)实例附加到持久性上下文。因此,它在您创建新项目时使用(使用POST方法)