2010-11-08 17 views
5

的使用問題我有下面的類:與@PreUpdate

@MappedSuperclass 
public abstract class MappedModel 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", nullable = false, unique = true) 
    private Long mId; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "rec_created_dtm", nullable = false, updatable = false) 
    private Date recordCreatedDTM; 

    @Column(name = "rec_cre_user_id", nullable = true, updatable = false) 
    private Long recordCreatedUserId; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "last_update_dtm", nullable = false) 
    private Date lastUpdateDTM; 

    @Column(name = "last_update_user_id", nullable = true) 
    private Long lastUpdateUserId; 

// @PrePersist 
// protected void onCreate() 
// { 
//  this.lastUpdateDTM = this.recordCreatedDTM = new Date(); 
// } 
// 
// @PreUpdate 
// protected void onUpdate() 
// { 
//  lastUpdateDTM = new Date(); 
// } 

    @PrePersist 
    @PreUpdate 
    protected void updateDates() { 
    if (this.recordCreatedDTM == null) { 
     this.recordCreatedDTM = new Date(); 
    } 
    lastUpdateDTM = new Date(); 
    } 

這個類由我所有的實體類。

所以我有以下的類

@Entity 
@Table(name="customer") 
public class Customer extends MappedModel implements Serializable 
{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -2543425088717298236L; 


    @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    @JoinColumn(name="address_id",nullable=true,updatable=true,insertable=true) 
    private Address mAddress; 

而且

@Entity 
@Table(name="address") 
public class Address extends MappedModel implements Serializable 
{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -3505413538055124608L; 

    @Column(name="address_line_1", length=150, nullable=false) 
    private String mAddressLine; 

    @Column(name="city", length=150, nullable=false) 
    private String mCity; 

    @Column(name="state", length=2, nullable=true) 
    private String mState; 

    @Column(name="postal_code", length=10, nullable=false) 
    private String mPostalCode; 

所以,當我創建一個新的客戶,我得到了以下錯誤:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM 

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583) 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 

我在做什麼這裏錯了。

+0

你能否提供你的異常的完整堆棧跟蹤。我不認爲你有'PreUpdate'或'PrePersist'的問題。消息'not-null屬性引用空值或瞬態值:vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM'表示'lastUpdateDTM'爲'null',可能Hibernate在觸發任何'@Pre ...'之前失敗方法。 – kraftan 2010-11-08 10:01:39

回答

9

PrePersistPreUpdate回調都在MappedSuperclass工作...利用JPA,這是不是在你的情況清楚EntityManager API時,至少。

您是使用EntityManager還是Session API?在後一種情況下,使用來自JPA的註釋PrePersist,PreUpdate註釋的方法將不會被調用(並且我的建議是使用a listener or an interceptor)。

+0

使用會話 - 不使用JPA – boyd4715 2010-11-08 13:30:15

+0

那麼它不能工作 – 2010-11-08 13:42:47

+0

那麼有道理 - 猜我錯過了在文檔 - 謝謝 – boyd4715 2010-11-08 15:23:55

相關問題