【问题标题】:Modifying annotation attribute value at runtime in java在java中在运行时修改注释属性值
【发布时间】:2011-03-04 23:26:09
【问题描述】:

我们的模型 pojo 中的一些方法被这样注释:

@Column(name="cli_clipping_id", updatable=false, columnDefinition = "varchar(" + ModelUtils.ID_LENGTH + ") COLLATE utf8_bin")

columnDefinition 属性取决于数据库供应商,因此当尝试使用 Hibernate 在 HSQLDB 中删除模式时会失败:

[ERROR] 16 jun 12:58:42.480 PM main [org.hibernate.tool.hbm2ddl.SchemaExport]
Unexpected token: COLLATE in statement [create table cms.edi_editorial_obj (edi_uuid varchar(23) COLLATE] 

为了解决这个问题,我正在考虑这个解决方案(但如果不可能的话,我不想花时间),在运行时,为每个方法列注释:

  • 获取@Column注解
  • 创建列注释的副本,使用 javaassist 将 columnDefinition 设置为 null。
  • 将列方法注释设置为覆盖旧的复制列注释对象(我不知道这是可能的)

是否可以通过这种方式“破解”这些方法?

任何帮助将不胜感激......

【问题讨论】:

标签: java hibernate


【解决方案1】:

我认为您建议的方法是不可能的,因为:

  1. get在运行时的注解值实际上是一个实现注解接口的代理类。您不能为其属性设置新值。
  2. 无法在运行时为类或方法设置新的注释值。

但是,您可以迁移到基于 xml 的 Hibernate 配置,您可以在其中从代码外部修改参数。

【讨论】:

    【解决方案2】:

    如果您使用 ANT 构建,您可以执行预编译步骤并使用正则表达式来更改文件中的代码。

    【讨论】:

    • 我没有使用 Ant,我想知道如何修改类文件而不是代码源
    • @Lici 我只是想给你一个替代解决方案。
    【解决方案3】:

    虽然,这实际上是一个旧线程,上面的答案二对于第 2 点是不正确的: 实际上,类注释可以在运行时更改。

    我仍然很好奇如何完成方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多