6

私は注釈付きのこの休止状態のクラスを持っています:

@Entity
public class SimponsFamily{

  @Id
  @TableGenerator(name = ENTITY_ID_GENERATOR,
                table = ENTITY_ID_GENERATOR_TABLE,
                pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME,
                valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME)
  @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR)
  private long id;

  ...
}

クラスのすべてのidフィールドにそのように注釈を付けるわけではないので、カスタム注釈を作成しようとしました。

@TableGenerator(name = ENTITY_ID_GENERATOR,
            table = ENTITY_ID_GENERATOR_TABLE,
            pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME,
            valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EntityId {

    @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR)
    public int generator() default 0;

    @Id
    public long id() default 0;
}

クラスでこの注釈を使用できるようにします。

 @Entity
 public class SimponsFamily{


 @EntityId
 private long id;

  ...
}

TYPE RetentionPolicy をサポートしていないため、フィールド レベルで@Idおよびアノテーションを記述する必要があります。@GeneratedValueこのソリューションはうまくいくようです。

私の質問:

  • カスタム アノテーション (および値) のフィールド レベルのアノテーションは、EntityId アノテーションの使用法にどのように転送されますか?

  • カスタム注釈で設定したデフォルト値はどうですか? 使用時に属性を指定しないため、それらが使用されますか?

  • 注釈のフィールド レベルで注釈を使用するのは好ましい方法ですか?

4

1 に答える 1

4

3 番目の質問にお答えできると思います。

id必要なことを行う (ID マッピングの重複を避ける) ための一般的な方法の 1 つは、注釈付きand (楽観的ロックの場合) フィールドを保持する共通のスーパークラスを作成し、versionすべての永続オブジェクトがこのスーパークラスを拡張するようにすることです。スーパークラスがそれ自体でエンティティと見なされないようにするには、 で注釈を付ける必要があります@MappedSuperclass

ここにサンプルがあります(タイプミスで申し訳ありません、私は今手元にIDEを持っていません):

@MappedSuperclass
public class PersistentObject {

    @Id // Put all your ID mapping here
    private Long id;

    @Version
    private Long version;

}

@Entity
public class SimpsonsFamily extends PersistentObject {        
    // Other SimpsonFamily-specific fields here, with their mappings    
}
于 2013-06-19T21:26:14.060 に答える