有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何动态填充注释

遗憾的是,我今天忘了带上工作时的代码。但也许这个小例子会澄清一些事情

我使用hibernate将bean映射到表

示例:

import javax.persistence.column;
….
String columnameA;
….
@Column(name="columnameA")
public String getColumname(){
  return columnameA
}
….

我不想在我的源代码中硬编码columnname(“columnameA”),因为我需要在不构建整个项目的情况下切换columnname。 我想使用类似于:

@Column(name=getColumnName())

这不起作用想法是,在jndi树中的某个地方写入列名,并在启动时使用它。因此,我只需要重新启动应用程序来更改columnname

解决这个问题的唯一方法——我可以想到——是编写自己的注释,它扩展了hibernate类。有没有更简单的方法


共 (2) 个答案

  1. # 1 楼答案

    您可以为属性指定的唯一值是常量值,可以手动指定,也可以存储在public static final变量中

    注释不定义行为,只定义关于类、方法等的元信息。可以在注释处理器中指定行为,这些处理器读取注释并生成新的源代码或其他文件

    编写注释过程超出了我的知识范围,但您可以在Sun的Annotations Processing Tool指南中找到其他信息

  2. # 2 楼答案

    使用注释无法实现这一点,但解决特定问题的方法是实现自定义^{}

    public class NamingStrategyWrapper implements NamingStrategy {
        private NamingStrategy target;
    
        public NamingStrategyWrapper(NamingStrategy target) {
            this.target = target;
        }
    
        public String columnName(String arg0) {
            if ("columnameA".equals(arg0)) return getColumnName();
            else return target.columnName(arg0);        
        }
    
        ...
    }
    

    -

    AnnotationConfiguration cfg = new AnnotationConfiguration();
    cfg.setNamingStrategy(new NamingStrategyWrapper(cfg.getNamingStrategy()));
    factory = cfg.configure().buildSessionFactory();