2015-05-27 1 views
1
@Entity 
    @Table(name="transactions") 
    @NamedQuery(name="Transaction.findAll", query="SELECT t FROM Transaction t") 
    public class Transaction implements Serializable{ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue(strategy=GenerationType.IDENTITY) 
     @Column(name="id", nullable=false, unique=true, length=11) 
     private int id; 


     @CreationTimestamp 
     @Column(name="created_at") 
     private Date createdAt; 
} 

У меня есть объект с использованием Hibernate. У меня есть требование, когда мне нужно обновить поле createdAt, но когда я попытаюсь выполнить его, это не сработает. СозданныйAt с момента создания, что имеет смысл.Как вставить/обновить атрибут объекта, который аннотируется как @CreationTimestamp?

Transaction newTransaction = new Transaction(); 
newTransaction.setCreatedAT(new Date);  
sessionFactory.openSession().save(newTransaction); 

Есть ли способ сохранить @CreationTimestamp аннотацию и быть в состоянии изменить или установить другую дату, когда это необходимо?

** Я использую Hibernate 4 с пружиной. Любое решение или другое предложение будет весьма полезно **

ответ

4

Зачем вы хотите установить его вручную? Намного более чистого решения было бы иметь 2 метода в вашем классе сущности. Обе аннотации из пакета персистентности.

private Date creationTime; 
private Date modificationTime; 

@PrePersist 
public void prePersist() { 
    Date now = Date(); 
    this.creationTime = now; 
    this.modificationTime = now; 
} 

@PreUpdate 
public void preUpdate() { 
    this.modificationTime = Date(); 
} 

или предпочтительно использовать Java 8 классов/Jodatime, в этом случае, нужно настроить @Type для полей вручную, так как Hibernate не поддерживает их из коробки, насколько я знаю.

+0

Я не вижу, как это намного чище, а затем использует @CreationTimestamp. Вопрос не в том, почему мне нужно вручную установить его. Я просто спрашиваю, возможно ли это - спасибо! – amjad

+0

Недействительный дизайн при попытке изменить то, что должно быть установлено только один раз (createdDate) в библиотеке. Я предполагаю, что аннотации перезаписывают любое значение, которое в настоящее время присутствует, поэтому вы не можете этого сделать. Я бы никогда не подумал, почему это нужно изменить. Если вам действительно нужна такая функциональность, то вообще не определяйте аннотацию и просто используйте геттеры/сеттеры. – Vaelyr

+0

имеет смысл. Оно работает. Благодаря! – amjad

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