具有Where约束的SecondaryTable



在我的场景中,什么是最佳解决方案?

我有一个滞后数据库,希望通过使用单个hibernate实体来访问数据。我希望java部分尽可能简单。

我的数据库由三个表组成:

  1. 表1(id,Att1,Att2(
  2. 表2(id,Att3(
  3. 表3(id,current,Att4(

我使用的@SecondaryTable名称如下:

@Entity
@Table(name = "Table1")
@SecondaryTables({
@SecondaryTable(name = "Table2", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")),
@SecondaryTable(name = "Table3", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")) 
})
public class Entity implements Serializable {
int id;
int Att1;
int Att2;
int Att3;
int Att4;
}

这对于Table2Att3来说完全可以。然而,在表3中,如果current = true,我只想要Att4。假设Att4的旧版本保留在Table3中。这可以由@SecondaryTable完成吗?还是我需要另一种方法?我更喜欢保留一个实体,而不是通过创建一个不重要的Table3实体来使用@OneToMany。

current添加到实体中怎么样?

public class Entity implements Serializable {
int  id;
int  Att1;
int  Att2;
int  Att3;
int  Att4;
byte current;
}

从另一方面来说,如果您想要这里的最佳解决方案,我会在SQL Server中进行更改。正因为如此,您将获得最大的性能优势,因为SQL Server基数估计器将能够创建最优化的执行计划。这将限制在转换中浪费的不必要的SQL Server事务的数量,以及应用程序和数据库之间传输的数据量。您所需要做的就是在SQL Server端:

CREATE VIEW [YourEntityOnDB]
AS
SELECT t1.[id], t1.[Att1], t1.[Att2], t2.[Att3], t3.[Att4]
FROM [Table1] t1
JOIN [Table2] t2 ON t1.[id] = t2.[id]
JOIN [Table3] t3 ON t1.[id] = t3.[id]
WHERE t3.[current] = 1;

您的JAVA部分将尽可能简单,因为[YourEntityOnDB]将是您要调用的唯一对象,它将包含所有id、Att1、Att2、Att3、Att4和current=1。除此之外,基于数据的唯一性和您的需求,您可以应用一些索引(甚至为新视图建立索引(,使其运行得更快。在最近的版本(SQL Server 2014+(中,如果需要,甚至有内存选项可以使其快速发光。应用程序和数据库上都有很多选项可以达到相同的目的,但这主要取决于您的需求和公司标准。我见过一些公司,他们的数据关系都是由应用程序驱动的,也见过一些公司的业绩。

最新更新