2015-10-14 18 views
0

我正在開發一個Spring Framework項目。對於快速開發過程,我使用Spring Roo(1.3.2)。對於多個實體,我需要存儲創建時間和上次更新的時間。我在Spring Roo教程項目上做了幾個實驗,這是我試圖做的一個實體和方法。Spring Framework的auditng字段(CreatedAt,UpdatedAt)

package com.springsource.roo.pizzashop.domain; 
import org.springframework.roo.addon.javabean.RooJavaBean; 
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord; 
import org.springframework.roo.addon.tostring.RooToString; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
import java.util.Date; 
import javax.persistence.PrePersist; 
import javax.persistence.PreUpdate; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import org.springframework.format.annotation.DateTimeFormat; 

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord 
public class Topping { 

    /** 
    */ 
    @NotNull 
    @Size(min = 2) 
    private String name; 

    /** 
    */ 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(style = "M-") 
    private Date createdAt; 

    /** 
    */ 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(style = "M-") 
    private Date updatedAt; 

    @PrePersist 
    protected void onCreate() { 
     createdAt= new Date(); 
    } 

    @PreUpdate 
    protected void onUpdate() { 
     updatedAt = new Date(); 
    } 
} 

當我創建一個對象(Topping)時,它爲createdAt獲取正確的值併爲updatedAt留下「NULL」。完善!這就是它必須的方式!

但是,當我更新對象(Topping)時,它獲取了正確的值updatedAt並失去了createdAt(NULL)的值。

問題是,當我更新對象時,我失去了createdAt的值。

你能告訴我爲什麼我會得到這種行爲嗎?你能幫我解決一個可能的解決方案嗎?

但是,createdAt和updatedAt字段不需要出現在「視圖」(create.jspx,update.jspx)中,所以我將其渲染屬性設置爲false。 這些是用於創建和更新的表單。

create.jspx

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<div xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields" xmlns:form="urn:jsptagdir:/WEB-INF/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" version="2.0"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <jsp:output omit-xml-declaration="yes"/> 
    <form:create id="fc_com_springsource_roo_pizzashop_domain_Topping" modelAttribute="topping" path="/toppings" render="${empty dependencies}" z="w4+E4tQPCNRPSYVWPNOBUuf9zNE="> 
     <field:input field="name" id="c_com_springsource_roo_pizzashop_domain_Topping_name" min="2" required="true" z="GRdEGRLiZ0QLjBH0pTEOZ252BD8="/> 
     <field:datetime dateTimePattern="${topping_ts_date_format}" field="ts" id="c_com_springsource_roo_pizzashop_domain_Topping_ts" render="false" z="user-managed"/> 
     <field:datetime dateTimePattern="${topping_updated_date_format}" field="updated" id="c_com_springsource_roo_pizzashop_domain_Topping_updated" render="false" z="user-managed"/> 
    </form:create> 
    <form:dependency dependencies="${dependencies}" id="d_com_springsource_roo_pizzashop_domain_Topping" render="${not empty dependencies}" z="bkqRYdlfs3kDAjK51P0O+7NiahE="/> 
</div> 

update.jspx

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<div xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields" xmlns:form="urn:jsptagdir:/WEB-INF/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <jsp:output omit-xml-declaration="yes"/> 
    <form:update id="fu_com_springsource_roo_pizzashop_domain_Topping" modelAttribute="topping" path="/toppings" versionField="Version" z="YGl9ujJNQw182uzoCDgi1FdiafQ="> 
     <field:input field="name" id="c_com_springsource_roo_pizzashop_domain_Topping_name" min="2" required="true" z="GRdEGRLiZ0QLjBH0pTEOZ252BD8="/> 
     <field:datetime dateTimePattern="${topping_ts_date_format}" field="ts" id="c_com_springsource_roo_pizzashop_domain_Topping_ts" render="false" z="user-managed"/> 
     <field:datetime dateTimePattern="${topping_updated_date_format}" field="updated" id="c_com_springsource_roo_pizzashop_domain_Topping_updated" render="false" z="user-managed"/> 
    </form:update> 
</div> 

回答

0

渲染= 「假」上的字段標籤,使這個領域將不包括頁面上。所以,在POST請求上,這個值是丟失的,並且Spring綁定不會填充它(以綁定進程創建實體的新實例爲計數單位,不會從DB獲取它)。這使合併操作將缺失值設置爲null

有關此的詳細信息,你可以閱讀:

最簡單的解決方法是包括編輯表單的隱藏輸入此值。

另一方面,看看審計功能gvNIX。此功能包括審計(存儲創建/更新時間戳和完成它的用戶)和修訂日誌(使用Hibernate Envers)。

祝你好運!

相關問題