2013-08-21 4 views
1

Я использую JPA с реализацией Hibernate. У меня есть @Entity сделка выглядит следующим образом:Временная метка поля JPA не обновляется

@Entity 
public class Transaction { 

    private int id; 
    private Date timestamp; 

    ... 

    @Basic 
    @Column(name = "timestamp", insertable = false, updatable = true) 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Date timestamp) { 
     this.timestamp = timestamp; 
    } 

    ... 

    @Column(name = "id") 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "transaction_id_seq") 
    @SequenceGenerator(name = "transaction_id_seq", sequenceName = "transaction_id_seq", allocationSize = 1) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 


} 

Когда я создаю новую транзакцию не установить id и timestamp полей, и я сохранить его в БД с помощью persist()

PersistenceProvider pp = new HibernatePersistence(); 
EntityManagerFactory emf = pp.createEntityManagerFactory("pu", new HashMap()); 
EntityManager em = emf.createEntityManager(); 

Transaction t = new Transaction(); 

em.getTransaction().begin(); 
em.persist(t); 
em.getTransaction().commit(); 

После запуска этого кода id внутри транзакции t является одним, автогенерируемым БД, но метка времени - null.

Как я могу сделать тигры так, чтобы timestamp был возвращен объекту после persist()?

спасибо

+0

Я использую Postgresql, и я не указывал, что временная метка генерируется в соответствии с базой данных с помощью функции now() – hurtledown

ответ

2

TemporalType.TIMESTAMP действует по-разному, как вы ожидаете.

Он автоматически не вставляет текущую временную метку в столбец при создании записи. Он просто описывает, какую информацию с даты нужно сохранить в базе данных. JPA не поддерживает эту функциональность AFAIK.

Для функциональных возможностей, которые вы ищете Я знаю, что Mysql поддерживает создание колонки с текущего времени в качестве значения по умолчанию

CREATE TABLE `Transaction` (
    ... 
    `timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
) 

Посмотрите на documentation, если вы хотите, чтобы изменить значение на обновления также.

Если вы используете Oracle, я бы предложил триггер.

CREATE TRIGGER <trigger_name> BEFORE INSERT ON Transaction FOR EACH ROW SET NEW.timestamp = CURRENT_TIMESTAMP; 

В противном случае вам придется вручную инициализировать поле временной метки в вашем объекте сделки, прежде чем сохраняющаяся его.

+0

Спасибо, но проблема заключается не в генерации временной метки, которая выполняется правильно db, проблема в том, что он не автоматически извлекается. – hurtledown

+0

Попробуйте em.refresh (t) – maxmil

+0

ДА :) это сработало, спасибо !!! – hurtledown

Смежные вопросы