我在我的应用程序中使用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无法更新它.谢谢你的时间.
首先,save是插入一个新实体.更新附加实体时不应使用它.附加实体的状态在刷新时自动写入数据库(如果已更改).您无需调用任何内容即可更新状态.
并且Hibernate不会神奇地重新读取它已插入/更新的行以获取生成的时间戳.需要特定的@Generated注释才能做到这一点.但它会降低应用程序的性能.
我将使用预插入/预更新挂钩以编程方式在实体中设置modifiedOn值,并避免在数据库中自动修改时间戳.
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |