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

时间:2013-05-29 09:31:13

标签: 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,
                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注释的使用情况?

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

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

1 个答案:

答案 0 :(得分:4)

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

执行所需操作的一种常见方法(避免重复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    
}