2015-11-11 42 views
1

大家好我有我的數據庫中的updated_at列有一些問題。我使用休眠,當我更新模型時,除了@preUpdate方法外,一切都正常。我所有的應用模型正在擴展這一基本型號:休眠前更新沒有更新字段

@MappedSuperclass 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
@Access(AccessType.PROPERTY) 
public class BaseModel implements Serializable { 

    // VARIABLES --------------------------------------------------------------- 
private Integer globalKey; 
private Integer id; 
private Date createdAt; 
private Date updatedAt; 
private Date deletedAt; 
private User createUser; 
private User updateUser; 
private User deleteUser; 

    // CONSTRUCTORS ------------------------------------------------------------ 

    // GETTERS AND SETTERS ----------------------------------------------------- 

    // [hashCode, equals and toString methods] --------------------------------- 

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

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

這是對更新的DAO的方法:

public MYOBJECT updateEntity(MYOBJECT entity, User updateUser) throws Exception { 
    entity.setUpdateUser(updateUser); 

    sessionFactory.getCurrentSession().update(entity); 

    return entity; 
} 

我缺少的東西?在我的數據庫中,我看到:

--------------------------------------------- 
| id | updated_at | id_user_update | 
| 1  | NULL   | 1     | 
--------------------------------------------- 
+1

「@PrePersist」是否正常工作? 「@PrePersist」或「@PreUpdate」都不能使用Session API工作。 EntityManager應該工作得很好。也許你應該參考這個[問題](http://stackoverflow.com/questions/4121628/issues-with-the-usage-of-preupdate/) – Bonifacio

+1

'@ PrePersist'正常工作,當我添加一個新的模型方法'onCreate()'被調用。我一起使用spring和hibernate,所以我不知道EntityManager是否已設置和/或是否具有適當的配置,如果需要,我可以編輯我的帖子,包括spring和休眠配置 – IlGala

+0

如果您使用SessionFactory,那麼很可能該EntityManager根本沒有使用。我最好在這裏嘗試一下使用EntityManager的實現,但不幸的是我不知道如何使用Spring來設置這種類型的東西。 – Bonifacio

回答

0

我已經找到了答案,我的問題here

但只是修改......在這裏一點點是我的代碼:

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

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

然後我創建了一個:

所有我從BaseModel類這兩種方法去除第一BaseTimestamps接口,用於建立我的createdAt和updatedAt變量

public interface BaseTimestamps { 

    /** 
    * On create event. 
    * used to setup a the creation variable. 
    * 
    * @param createdAt 
    */ 
    void setCreatedAt(Date createdAt); 

    /** 
    * On update event. 
    * used to setup a the update variable. 
    * 
    * @param updatedAt 
    */ 
    void setUpdatedAt(Date updatedAt); 
} 

最後,我創建了兩個偵聽器休眠會話工廠中的hibernate.cfg.xml文件。

// SAVE LISTENER 
public class SaveListener extends DefaultSaveEventListener { 

    @Override 
    public void onSaveOrUpdate(SaveOrUpdateEvent event) { 
     if (event.getObject() instanceof BaseTimestamps) { 
      BaseTimestamps record = (BaseTimestamps) event.getObject(); 
      record.setCreatedAt(new Date()); 
     } 

     super.onSaveOrUpdate(event); 
    } 

} 

// UPDATE LISTENER 
public class UpdateListener extends DefaultUpdateEventListener { 

    @Override 
    public void onSaveOrUpdate(SaveOrUpdateEvent event) { 
     if (event.getObject() instanceof BaseTimestamps) { 
      BaseTimestamps record = (BaseTimestamps) event.getObject(); 
      record.setUpdatedAt(new Date()); 
     } 

     super.onSaveOrUpdate(event); 
    } 

} 

這裏是我的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <mapping class="my.package.MyModel"/> 
    // ............................ 
    <mapping class="my.package.OtherModel"/> 
     <event type="save"> 
     <listener class="my.package.SaveListener"/> 
     </event> 
     <event type="update"> 
     <listener class="my.package.UpdateListener"/> 
     </event> 
    </session-factory> 
</hibernate-configuration> 

當我執行創建或更新,一切工作正常,我在我的數據庫中看到正確的價值觀。