0

我有一个域对象

@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 直接放在注释中,我告诉他我们只能将表/视图用于与域对象的映射。

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

4

1 回答 1

0

如果您不更新此实体,则可以使用 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-06-05T16:55:52.967 回答