在进行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个)获得一个需要更新数据库结构的新功能(例如表中的新字段)。我为他发布了一个新版本,他运行数据库架构更新并可以使用新功能。但是,每当任何用户获得新功能时,所有其他客户端都不会执行增量数据库更新。他们只想使用最新版本,但受新功能(对于那个客户端)的影响,他们永远不会使用。
答案 0 :(得分:3)
我认为只有将映射定义与实体分开才可以替换它。因此,您无法使用基于注释的映射。
相反,我建议使用基于xml的映射,并为每个客户端创建不同的xml映射文件。由于您有大约500个客户端,因此您可能希望创建所有共享相同映射文件的客户端组。
至少我认为用一个实体模型维护不同的客户需求将非常困难,这将导致复杂的代码结构。例如。如果为某些客户端添加的属性可以为null,那么您还需要为代码添加更多的空值检查。对每个客户特定属性进行一次空检查。