2010-11-08 57 views
5

Tôi có lớp sau đây:Các vấn đề với việc sử dụng @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(); 
    } 

Lớp này được sử dụng bởi tất cả các lớp thực thể của tôi.

Vì vậy, tôi có lớp sau

@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; 

Vì vậy, khi tôi tạo ra một khách hàng mới tôi nhận được lỗi sau:

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) 

Tôi đang làm gì sai ở đây.

+0

Bạn có thể vui lòng cung cấp toàn bộ stacktrace ngoại lệ của mình hay không. Tôi không nghĩ rằng bạn có vấn đề với 'PreUpdate' hoặc' PrePersist'. Thông điệp 'không null tài sản tham chiếu một giá trị null hoặc thoáng qua: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM' nói rằng' lastUpdateDTM' là 'null' và có thể Hibernate không thành công trước khi kích hoạt bất kỳ' @Pre ... ' phương pháp. – kraftan

Trả lời

9

Số gọi lại PrePersistPreUpdate làm việc trong MappedSuperclass ... ít nhất là khi sử dụng EntityManager API từ JPA, điều này không rõ ràng trong trường hợp của bạn.

Bạn đang sử dụng EntityManager hoặc API Session? Trong trường hợp sau, các phương thức được chú thích bằng cách sử dụng chú thích PrePersist, PreUpdate từ JPA sẽ không được gọi (và đề xuất của tôi sẽ là sử dụng a listener or an interceptor).

+0

Sử dụng phiên - không sử dụng JPA – boyd4715

+0

cũng sau đó nó không thể làm việc –

+0

cũng có ý nghĩa sau đó - đoán tôi bị mất trong tài liệu - cảm ơn – boyd4715

Các vấn đề liên quan