Отметка времени последнего обновления с JPA - PullRequest
12 голосов
/ 17 ноября 2009

Я немного поиграюсь с JPA (точнее, Eclipselink). Нижеприведенный объект имеет отметка времени, которая должна отражаться при каждом последнем обновлении этой сущности.

Каковы стратегии, чтобы JPA автоматически обновляла эту временную метку каждый раз эта сущность изменена?

Как бы я поступил, если бы мне также понадобилась временная метка «создания», устанавливаемая только при первом сохранении сущности, которую никогда больше нельзя изменять?

 @Entity
 public class Item implements Serializable {
     private static final long serialVersionUID = 1L;
     private Integer id;
     private String note;


    public Item () {
    }


    @Id
    @GeneratedValue(strategy=SEQUENCE)
    @Column(unique=true, nullable=false)
    public Integer getId() {
        return this.id;
    }

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


    @Column(length=255)
    @Column(nullable=false)
    public String getNote() {
        return this.note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    @Column(nullable=false)
    public Timestamp getUpdated() {
        return this.updated;
    }

    public void setUpdated(Timestamp updated) {
        this.updated = updated;
    }


}

Ответы [ 3 ]

16 голосов
/ 17 ноября 2009

Используйте @ PrePersist и @ PreUpdate аннотации и напишите собственный прослушиватель событий.

Посмотрите на этот ответ для подробностей. Он помечен как Hibernate, но применим к любому провайдеру JPA.

2 голосов
/ 17 ноября 2009

если вы используете mysql, я думаю, что вы можете сделать следующее, чтобы отключить обновление отметок времени от объекта

@Column(name = "lastUpdate", updatable= false, insertable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdate;

для оракула вы должны установить временные метки от объекта, используя аннотацию @PreUpdate, как объяснено выше.

1 голос
/ 29 августа 2012

На самом деле, surajz ответ работает. Рассмотрим сценарий, в котором вы отслеживаете 2 метки времени. Вы хотите вручную обновить их через объект. Вам нужно установить один на updateble=false (тот, который вы не хотите обновлять при обновлении записи), а другой оставить свободным для обновлений.

Вот что у меня сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...