2010-11-08 9 views
5
@PreUpdate

J'ai la classe suivante:Problèmes avec l'utilisation de

@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(); 
    } 

Cette classe est utilisée par toutes mes classes d'entités.

J'ai donc la classe suivante

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

Et

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

Alors, quand je crée un nouveau client, je reçois l'erreur suivante:

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) 

Qu'est-ce que je fais mal ici.

+0

Pouvez-vous s'il vous plaît fournir la pile complète de votre exception. Je ne pense pas que vous ayez un problème avec 'PreUpdate' ou' PrePersist'. Le message 'propriété null-null fait référence à une valeur nulle ou transitoire: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM' dit que lastUpdateDTM' est' null' et que probablement Hibernate échoue avant de déclencher '@Pre ...' méthodes – kraftan

Répondre

9

Le PrePersist et PreUpdate callbacks ne fonctionnent dans un MappedSuperclass ... au moins lorsque vous utilisez l'API EntityManager de JPA, ce qui est clair dans votre cas. Utilisez-vous le EntityManager ou l'API Session? Dans le dernier cas, les méthodes annotées à l'aide des annotations PrePersist, PreUpdate de JPA ne seront pas appelées (et ma suggestion serait d'utiliser a listener or an interceptor).

+0

En utilisant la session - ne pas utiliser JPA – boyd4715

+0

bien alors il ne peut pas fonctionner –

+0

bien que cela a du sens alors - devinez que j'ai manqué dans la documentation - merci – boyd4715