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

我有这个带有注释的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字段,所以我尝试创建自定义anotation:

 @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注释,因为它们不支持TYPE RetentionPolicy。 这个解决方案似乎有效。

我的问题:

  • 如何将自定义注释(和值)中的字段级注释转移到我对EntityId注释的使用?

  • 我在自定义注释中设置的默认值如何使用,因为我没有在使用中指定属性?

  • 在注释中在字段级别使用注释是一种首选方法吗?

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

执行所需操作的一种常见方法(避免重复ID映射)是创建一个公共超类,它包含带注释的idversion (用于乐观锁定)字段,然后让所有持久对象扩展此超类。 为确保超类本身不被视为实体,必须使用@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 }