【问题标题】:Changing from views to sql joins in hibernate在休眠中从视图更改为 sql 连接
【发布时间】:2012-06-09 14:51:15
【问题描述】:

我有一个域对象

@Entity
@Table (name = "vw_t_bucket")
public class TBucket {

....

@ManyToOne (cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, targetEntity = Prd.class)
      @JoinColumns({
          @JoinColumn(name = "key", referencedColumnName="key"),
          @JoinColumn(name = "cdate", referencedColumnName="cdate")
      })
      public IPrd getPrd() {
        return prd;
      }
....

      @ManyToOne (cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER, targetEntity = Acct.class)
      @JoinColumn (name = "acct", nullable = false)
      public IAcct getAcct() {
            return acct;
      }

}

@Entity
@Table (name = "product")
public class Prd implements IPrd {
...
}


@Entity
@Table (name = "vw_acct")
public class Acct implements IAcct {
...
}

如您所见,TBucket 是一个视图,并且连接到表 (product) 和另一个视图 (vw_acct)

我的数据库告诉我,视图和表的连接性能不佳,我需要将视图更改为表。

但是,视图本身是由多个表的连接组成的。

我的领导想知道是否有一种解决方案,我们可以将连接 sql 直接放在注释中,我告诉他我们只能将表/视图用于与域对象的映射。

我想知道这个问题是否有任何可能的解决方案。

【问题讨论】:

  • 视图和表之间的连接没有理由必然表现不佳。也许这些特定的连接会表现不佳(我假设这就是您的 DBA 的意思),但这与您正在连接视图和表这一事实无关。
  • 我同意 Todd 的观点,并建议调查和了解当前查询的具体性能问题。在 Oracle 中,您需要阅读使用 EXPLAIN PLAN 来理解并将其应用于相关查询。
  • 引用 DBA -“我们也有与其他表/视图连接的视图。我们应该只有表到表连接或从视图中简单选择。”

标签: hibernate jakarta-ee join hibernate-mapping


【解决方案1】:

如果您不更新此实体,则可以使用 org.hibernate.annotations.Subselect 注释来命名要使用的确切 SQL。它实际上是很久以前开发的(在 HBM XML 映射方面),作为不支持视图的数据库上的视图的替身。但是,就像我提到的,它是只读的。

如果需要更新,则需要使用 org.hibernate.annotations.Loader、org.hibernate.annotations.SQLInsert、org.hibernate.annotations.SQLUpdate 和 org.hibernate.annotations.SQLDelete 注解来完全映射实体。

然而,另一种选择(取决于数据库视图的确切性质)是将连接映射为 SecondaryTables。

【讨论】:

  • 非常感谢!这正是我想要的。
猜你喜欢
  • 2012-03-26
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多