2014-01-23 87 views
3

是否有可能以某種方式告訴Hibernate在執行CRUD操作時有條件地忽略數據庫表中缺少的列?如何讓Hibernate有條件地忽略CRUD操作中的列

我有一個使用Hibernate作爲持久層的Java應用程序。我希望能夠以某種方式告訴Hibernate:如果數據庫版本爲< 50,那麼忽略此列註釋(或將其設置爲瞬態)

出現這種情況是由於不同客戶端的數據庫版本不同,但所有站點的實體代碼相同。例如,我有一個類,其中description2列可能在某些數據庫中未命中。

@Entity 
@Table(name = "MY_TABLE") 
public class MyTable implements java.io.Serializable { 

    private Integer serialNo;  
    private String pickCode; 
    private String description1; 
    private String description2; 

    @Id 
    @Column(name = "Serial_No", nullable = false) 
    @GenericGenerator(name = "generator", strategy = "increment") 
    @GeneratedValue(generator = "generator") 
    public Integer getSerialNo() { 
     return this.serialNo; 
    } 

    @Column(name = "Pick_Code", length = 25) 
    public String getPickCode() { 
     return this.pickCode; 
    } 

    @Column(name = "Description1") 
    public String getDescription1() { 
     return this.description1; 
    } 

    @Column(name = "Description2")  // <- this column might miss in some databases 
    //@TransientIf(...) <- something like this would be nice, or any other solution 
    public String getDescription2() { 
     return this.description2; 
    } 
} 

背景:我有很多定製針對不同客戶的大型應用程序。現在有時會發生這樣的情況:一個客戶端(可以說500個)獲得需要數據庫結構更新的新功能(例如表中的新字段)。我爲他發佈一個新版本,他運行數據庫模式更新並可以使用新功能。但是,每當任何用戶獲得新功能時,所有其他客戶端都不會執行增量數據庫更新。他們只是想使用最新版本,但受到它們永遠不會使用的新功能(針對該客戶端)的影響。

回答

3

我認爲這是唯一可能的,如果你分開的映射定義與實體,以便您可以將其替換。因此你不能使用基於註解的映射。

相反,我會建議使用基於xml的映射併爲每個客戶端創建不同的xml映射文件。由於您擁有大約500個客戶端,因此您可能需要創建所有共享相同映射文件的客戶端組。

至少我認爲用一個實體模型來維護不同的客戶需求是非常困難的,並且會導致一個複雜的代碼結構。例如。如果您向某些客戶端的可以爲null的內容添加屬性,那麼您也會爲代碼添加更多的空檢查。對每個客戶特定的屬性進行一次空檢查。