Java 如何在字段级别创建元注释?

Java 如何在字段级别创建元注释?,java,annotations,hibernate-annotations,Java,Annotations,Hibernate Annotations,我有一个带注释的hibernate类: @Entity public class SimponsFamily{ @Id @TableGenerator(name = ENTITY_ID_GENERATOR, table = ENTITY_ID_GENERATOR_TABLE, pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME, v

我有一个带注释的hibernate类:

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

  ...
}
我必须在字段级别编写
@Id
@GeneratedValue
注释,因为它们不支持类型保留策略。这种解决方案似乎有效

我的问题是:

  • 如何将自定义注释(和值)中的字段级注释转换为EntityId注释

  • 我在自定义注释中设置的默认值是什么,因为我在使用时没有指定属性,所以是否使用它们

  • 在注释中,在字段级别使用注释是首选方法


    • 我想我可以回答你的第三个问题

      一种常见的实现方法(避免重复ID映射)是创建一个公共超类,该超类包含带注释的
      ID
      version
      (用于乐观锁定)字段,然后让所有持久对象扩展该超类。 为确保超类本身不被视为实体,必须使用
      @MappedSuperclass
      对其进行注释

      下面是一个示例(很抱歉,我手头没有IDE):


      我的希望是我可以避免超类,但也许这是一条路要走。。。也许我的问题更像是一般的注释问题,而不是hibernate问题。反正是Thx!
      @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    
      }