Столбец TIMESTAMP не обновляется - PullRequest
0 голосов
/ 14 сентября 2011

Я использую 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)
);

И я сохраняю и обновляю объекты "Кампания" следующими методами (отображение hibernate через файлы hbm):

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

"«Изменено» обновляет столбец, когда я запускаю запрос на обновление базы данных.Но Hibernate не в состоянии обновить его.Спасибо за ваше время.

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Прежде всего, save - для вставки новой сущности.Вы не должны использовать его при обновлении присоединенного объекта.Состояние присоединенной сущности автоматически записывается в базу данных (если изменено) во время сброса.Вам не нужно ничего вызывать для обновления состояния.

И Hibernate волшебным образом не перечитает строку, которую он вставил / обновил, чтобы получить сгенерированную метку времени.Для этого необходима специальная аннотация @Generated.Но это снизит производительность приложения.

Я бы использовал ловушку перед вставкой / обновлением, чтобы программно установить значениеifiedOn в сущности и избежать автоматически изменяемых временных отметок в базе данных.

1 голос
/ 14 сентября 2011

В дополнение к ответу JB Низета , если modifiedOn обновляется триггером, взгляните на org.hibernate.Session#refresh().

Если поле обновляется триггером, когда hibernate сохраняет сущность, у которой есть старая дата, триггер обновляет запись на уровне БД (не сущность спящего режима), а затем, когда сеанс закрывается, ввремя фиксации, Hibernate видит сущность как грязную, потому что поле modifiedOn имеет другое значение в БД.Итак, другое обновление запускается, и это как если бы триггер никогда не обновлял поле.refresh() обновит состояние сущности на состояние из БД после обновления и выполнения триггера, чтобы они могли синхронизироваться во время фиксации.

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().update(campaign);
        getSession().flush();
        getSession.refresh(campaign);
        return campaign.getModifiedOn();
    }
return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...