TIMESTAMP列未更新

tus*_*sar 0 mysql hibernate

我在我的应用程序中使用Struts2,Spring和Hibernate,数据库是MySQL 5.5.我在数据库中有这个表:

create table if not exists campaigns(
    id int(10) not null auto_increment,
    campaignId int(25) not null unique,
    createdBy int(25) not null REFERENCES users(userId),
    campaignName varchar(255) not null,
    subject varchar(500),
    body varchar(50000),
    modifiedOn TIMESTAMP,
    triggeredOn date,
    numberOfTargets int(10),
    primary key (id, campaignId)
);
Run Code Online (Sandbox Code Playgroud)

我使用以下方法保存和更新"Campaign"对象(通过hbm文件进行hibernate-mapping):

public boolean addCampaign(long createdBy, String campaignName) throws NoSuchAlgorithmException {
    Campaign campaignObject = new Campaign();
    SecureRandom generatedHash = SecureRandom.getInstance("SHA1PRNG");
    campaignObject.setCampaignId(new Integer(generatedHash.nextInt()));
    campaignObject.setCreatedBy(createdBy);
    campaignObject.setCampaignName(campaignName);
    getHibernateTemplate().save(campaignObject);
    getSession().flush();
    return true;
}

public Date updateCampaign(String campaignId, String subject, String body) throws NumberFormatException {
    Campaign campaign = getCampaignByCampaignId(Long.parseLong(campaignId));
    if(campaign != null) {
        campaign.setSubject(subject);
        campaign.setBody(body);
        getHibernateTemplate().save(campaign);
        getSession().flush();
        return campaign.getModifiedOn();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

当我在数据库上运行更新查询时,"modifiedOn"列会更新.但是hibernate无法更新它.谢谢你的时间.

JB *_*zet 5

首先,save是插入一个新实体.更新附加实体时不应使用它.附加实体的状态在刷新时自动写入数据库(如果已更改).您无需调用任何内容即可更新状态.

并且Hibernate不会神奇地重新读取它已插入/更新的行以获取生成的时间戳.需要特定的@Generated注释才能做到这一点.但它会降低应用程序的性能.

我将使用预插入/预更新挂钩以编程方式在实体中设置modifiedOn值,并避免在数据库中自动修改时间戳.