如何告诉Hibernate有条件地忽略CRUD操作中的列

时间:2014-01-23 12:55:35

标签: java database hibernate annotations

在进行CRUD操作时,是否有可能以某种方式告诉Hibernate有条件地忽略数据库表中缺少的列?

我有一个使用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个)获得一个需要更新数据库结构的新功能(例如表中的新字段)。我为他发布了一个新版本,他运行数据库架构更新并可以使用新功能。但是,每当任何用户获得新功能时,所有其他客户端都不会执行增量数据库更新。他们只想使用最新版本,但受新功能(对于那个客户端)的影响,他们永远不会使用。

1 个答案:

答案 0 :(得分:3)

我认为只有将映射定义与实体分开才可以替换它。因此,您无法使用基于注释的映射。

相反,我建议使用基于xml的映射,并为每个客户端创建不同的xml映射文件。由于您有大约500个客户端,因此您可能希望创建所有共享相同映射文件的客户端组。

至少我认为用一个实体模型维护不同的客户需求将非常困难,这将导致复杂的代码结构。例如。如果为某些客户端添加的属性可以为null,那么您还需要为代码添加更多的空值检查。对每个客户特定属性进行一次空检查。