在hibernate中从视图更改为sql连接

在hibernate中从视图更改为sql连接,hibernate,jakarta-ee,join,hibernate-mapping,Hibernate,Jakarta Ee,Join,Hibernate Mapping,我有一个域对象 @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",

我有一个域对象

@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是一个视图,并连接到表(产品)和另一个视图(vw_acct)

我的数据库告诉我,同时包含视图和表的连接将执行得很差,我需要将视图更改为表

但是,视图本身由来自多个表的联接组成

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


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

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

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


然而,另一种选择(取决于DB视图的确切性质)是将连接映射为第二个表。

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