3

Hibernate アノテーションと Sybase の両方を使用しています。ロックを防ぐためにバージョン列を設定しようとしています。アプリケーションではなく、データベースがタイムスタンプを管理する必要があります。hbm.xml ではなく注釈を使用してこれを実現したいと考えています。

成功せずに次のことを試しましたが、

私はjboss.orgを読んで使用しました

@org.hibernate.annotations.SourceType.DB
@org.hibernate.annotations.Generated(GenerationTime.ALWAYS)

ただし、DB の IDE コンパイル エラーが発生します。「シンボル symbol: クラス DB の場所: クラス SourceType が見つかりません」

およびrowVersionのコンパイルエラー、

バージョン フィールドまたはプロパティは、サポートされているタイプの 1 つではありません。int、Integer、short、Short、long、Long、java.sql.Timestamp のいずれかのタイプであることを確認してください。

一時属性は、@Temporal アノテーションでマークする必要があります。

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#d0e5785

5.1.3.2. タイムスタンプ

サンプルコード

@Version
@org.hibernate.annotations.SourceType.DB
@org.hibernate.annotations.Generated(GenerationTime.ALWAYS)
@Column(name = "row_version")
private Date rowVersion;

public Date getRowVersion() {
    return rowVersion;
}

public void setRowVersion(Date rowVersion) {
    this.rowVersion = rowVersion;
}

誰かが私に欠けているものを教えてもらえますか?

4

1 に答える 1

3

これは注釈ではなく、列挙型のフィールドです。

@org.hibernate.annotations.SourceType.DB

フィールドでこれが必要です:

@Version
@org.hibernate.annotations.Source(SourceType.DB)
@org.hibernate.annotations.Generated(GenerationTime.ALWAYS)
@Column(name = "row_version") //maybe unnecessary, because this annotation
                              //is only needed, if the column name does not
                              //match hibernate's default naming strategy
                              //(or custom strategy).
@Temporal(TemporalType.TIMESTAMP)
private Date rowVersion;
于 2012-10-12T18:19:24.537 に答える