【问题标题】:How to create meta annotations on field level?如何在字段级别创建元注释?
【发布时间】:2013-05-29 09:31:13
【问题描述】:

我有这个带有注释的休眠类:

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

我的问题:

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

  • 我在自定义注释中设置的默认值怎么样,因为我没有在使用时指定属性,所以它们被使用了吗?

  • 在注解中使用字段级别的注解是首选方式吗?

【问题讨论】:

    标签: java annotations hibernate-annotations


    【解决方案1】:

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

    做你想做的事(避免重复 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    
    }
    

    【讨论】:

    • 我希望我可以避免超类,但也许这是要走的路……也许我的问题更多的是一般注释问题而不是休眠问题。无论如何谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2019-06-20
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多