3

@Embeddable で JPA @Version アノテーションを使用すると、Updateableクラスを指す次の例外が発生します。

org.hibernate.AnnotationException: Unable to define @Version on an embedded class

これが私のコードです:

@Embeddable
public class Updateable {
    @Version
    private long modcount;

    private String updatedBy;

    private DateTime updatedAt;

    // getters & setters
}
@Entity
public class SomeEntity  {
    @Id
    private Long id;

    @Embedded
    private Updateable updateAudit;

    // other stuff

}

@Embeddable に @Version を含めることはできませんか、それとも Hibernate 固有のものですか?

4

1 に答える 1

6

埋め込み可能なクラスは、再利用可能なエンティティ要素を宣言する便利な方法です。つまりUpdateable、フィールドとマッピングを再度追加することなく、他のエンティティで使用できます。

そのため、embeddable はエンティティの一部であり (名前が示すように、埋め込まれていることを示しています)、独立したバージョン管理は意味がありません。

埋め込み可能オブジェクト自体をバージョン管理することはできず、単一のエンティティに複数の埋め込み可能オブジェクトが含まれている場合 (たとえば、その場合にどのバージョンを使用する必要があるか) に対処する必要があるため、埋め込み可能オブジェクトのみに注釈を追加する@Versionこともあまり意味がありません。 ?)。したがって、@Versionエンティティに対してのみ意味があるため、エンティティまたはマップされたスーパークラスに対してその注釈を許可する方が簡単です。

実際、JPA 仕様では、バージョン プロパティは数値、文字列、またはタイムスタンプであることが推奨されていますが、Hibernate はユーザー定義のバージョン タイプを提供しているようです。

バージョン列は、数値 (推奨される解決策) またはタイムスタンプです。Hibernate は、適切な UserVersionType を定義して実装する限り、あらゆる種類の型をサポートします。

したがって、バージョンとして使用したい場合にできること (テストされていない、ドキュメントから派生したもの)Updateableは、カスタム ユーザー タイプを提供し、次のUpdateableように使用することです。

@Entity
public class SomeEntity  {
  @Id
  private Long id;

  @Type( "your.custom.UserVersionType" )
  @Version
  private Updateable updateAudit;

  // other stuff
}
于 2014-07-03T10:53:51.010 に答える