1

Hibernate 実装で JPA を使用しています。@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フィールドとフィールドを設定せず、を使用してDBに保存します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 の内部は DB によって自動生成されたものですが、タイムスタンプはnull.

timestampオブジェクトが呼び出されるとオブジェクトに返されるようにするにはどうすればよいpersist()ですか?

ありがとうございました

4

1 に答える 1

2

TemporalType.TIMESTAMP は、予想とは異なる動作をします。

レコードの作成時に、現在のタイムスタンプが列に自動的に挿入されることはありません。日付からデータベースに保存する情報を単純に記述します。JPA はこの機能をサポートしていません。

あなたが探している機能について、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 に答える