【问题标题】:How to tell Hibernate to conditionally ignore columns in CRUD operations如何告诉 Hibernate 有条件地忽略 CRUD 操作中的列
【发布时间】:2014-02-14 00:56:40
【问题描述】:

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

我有一个使用 Hibernate 作为持久层的 Java 应用程序。我希望能够以某种方式告诉 Hibernate:如果数据库版本 。

这种情况是由于不同客户端的数据库版本不同,但所有站点的实体代码相同。例如,我有一个类,其中 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 个)获得需要更新数据库结构的新功能(例如,表中的新字段)。我为他发布了一个新版本,他运行数据库模式更新并且可以使用新功能。但是,当任何用户获得新功能时,所有其他客户端都不会进行增量数据库更新。他们只想使用最新版本,但受到他们永远不会使用的新功能(针对那个客户)的影响。

【问题讨论】:

    标签: java database hibernate annotations


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多