2010-06-17 72 views
4

在我们的模型中POJO的一些方法已经被注释是这样的:修改注释在运行时的属性值在Java

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

columnDefinition属性数据库供应商相关的,所以试图在HSQLDB下降模式时使用Hibernate它失败:

[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。
  • 组列方法注释copy列注释对象覆盖旧的(我不知道这是可能的)

是否有可能为“黑客”这些方法的这种方式?

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

+1

我用这个回答了一个类似的问题:http://stackoverflow.com/questions/906671/jpa-how-do-i-specify-the-table-name-corresponding-to-a-class-at-runtime/940380#940380 – 2010-06-17 13:57:53

回答

3

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

  1. 注释值,你get在运行时实际上是代理类实现的注释界面。您无法为其属性设置新值。
  2. 在运行时无法为类或方法设置新的注释值。

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

1

如果您正在使用ANT建筑,你可以做一个预编译的步骤,并使用正则表达式来更改文件的代码。

+0

我不使用Ant,我想知道如何修改类文件,而不是代码源 – Lici 2010-06-17 13:52:47

+0

@Lici我只是想给你一个替代解决方案。 – 2010-06-17 14:23:02

+0

我知道....(+1) – Lici 2010-06-18 05:21:13

0

尽管这实际上是一个旧线程,上面的答案2对于点2是不正确的: 实际上类的偏移量可以在运行时改变。

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

+1

你有什么例子吗? – Matsemann 2013-06-13 10:56:45