1

我将 JPA 与 Hibernate 实现一起使用。我的@entity 事务如下:

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


}

当我创建一个新事务时,我没有设置idtimestamp字段,而是使用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一旦被调用也返回到对象的方式来制作thigs persist()

谢谢你

4

1 回答 1

2

TemporalType.TIMESTAMP 的行为与您的预期不同。

创建记录时,它不会自动在列中插入当前时间戳。它简单地描述了从日期开始将哪些信息保存在数据库中。JPA 不支持此功能 AFAIK。

对于您正在寻找的功能,我知道 Mysql 支持创建以当前时间为默认值的列

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

如果您还想更改更新的值,请查看文档。

如果您使用的是 Oracle,那么我建议您使用触发器。

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

否则,您必须在持久化之前手动初始化 Transaction 对象中的时间戳字段。

于 2013-08-21T14:58:25.263 回答