一尘不染

在Java运行时修改批注属性值

hibernate

我们在模型pojos中的一些方法已被注释为:

@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。
  • 将列方法注释设置为覆盖旧对象的复制列注释对象(我不知道这是可能的)

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

任何帮助将非常感激 …


阅读 225

收藏
2020-06-20

共1个答案

一尘不染

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

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

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

2020-06-20