2010-06-21 79 views
4

不幸的是,我忘了今天將代碼與我一起工作。但也許這個小例子會澄清事情。如何動態填寫註釋

我使用hibernate將bean映射到表。

例子:

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

我不想硬編碼列名(「columnameA」)在我的源代碼,因爲我需要切換columname無需構建整個項目。 我想用這樣的:

@Column(name=getColumnName()) 

這是行不通的。這個想法是爲了在jndi樹的某處寫入列名並在啓動時使用它。所以我只需要重新啓動應用程序來更改列名。

解決這個問題的唯一方法 - 我能想到的 - 就是編寫自己的註釋,它擴展了hibernate類。有沒有更簡單的方法來做到這一點?

回答

1

你不能用註解達到這個目的,但你的具體問題的解決方案是實現一個自定義NamingStrategy

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(); 
0

您可以分配給屬性的唯一值是手動指定的恆定值,或存儲在public static final變量中。

註解不定義行爲,但只定義關於類,方法等的元信息。您可以在註釋處理器中指定行爲,讀取註釋並生成新的源代碼或其他文件。

編寫註釋處理程序超出了我的理解,但您可以在Sun的Annotations Processing Tool指南中找到其他信息。