【问题标题】:Is it possible to make `@SQLDelete` take the `hibernate.default_schema` parameter into account?是否可以让`@SQLDelete` 考虑`hibernate.default_schema` 参数?
【发布时间】:2012-11-09 23:24:18
【问题描述】:

在 web 应用程序中,我使用 Hibernate 的 @SQLDelete 注释来“软删除”实体(即将状态列设置为表示其“已删除”状态的值,而不是实际从表中删除它们)。

实体代码如下所示:

@Entity
@SQLDelete(sql="update pizza set status = 2 where id = ?")
public class Pizza { ... }

现在,我的问题是 Web 应用程序不使用表所属架构的所有者连接到数据库。例如。架构(在 Oracle 中)称为pizza,webapp 用来连接的数据库用户是pizza_webapp。这是出于安全原因。 pizza_webapp 用户只有选择/更新/删除权限,不能修改数据库本身的结构。我在这里别无选择,这是我无法改变的政策。

我在休眠配置中使用hibernate-default_schema 参数指定表实际所在的架构名称:

<property name="hibernate.default_schema">pizza</property>

这适用于通过映射实体的所有内容,Hibernate 知道如何在它生成的 SQL 中的表名前面添加模式名称。但不适用于原始 SQL,@SQLDelete 包含原始 SQL。这将“按原样”执行并生成"table or view not found error"

到目前为止,我们通过将同义词添加到 pizza_webapp 架构并指向 pizza 架构来解决此问题。它可以工作,但在添加实体时跨多个数据库进行维护并不好玩。

那么,是否可以让@SQLDelete 考虑hibernate.default_schema 参数?

(注意:显然我也不想在 SQL 中硬编码模式名称......)

【问题讨论】:

    标签: sql hibernate annotations


    【解决方案1】:

    是的,有可能:

    @SQLDelete(sql="update {h-schema}pizza set status = 2 where id = ?")
    

    【讨论】:

    • 不错!你在文档中有这方面的来源吗?
    【解决方案2】:

    我找不到任何 Hibernate 解决方案来解决这个问题。但是我发现了一个基于 Oracle 特性的解决方法。在使用它之前,我会在我的会话中这样做:

    //set the default schema at DB session level for raw SQL queries (see @SQLDelete)
    HibernateUtil.currentSession().doWork(new Work() {
        @Override
        public void execute(Connection connection) throws SQLException {
            connection.createStatement().execute("ALTER SESSION SET CURRENT_SCHEMA="+HibernateUtil.getDefaultSchema());
        }
    });
    

    我工作得很好,但不幸的是只在 Oracle 上(至少现在对我们来说很好)。也许在其他 RDBMS 上也有不同的方法可以实现相同的目标?

    编辑:HibernateUtil 类中的 getDefaultSchema() 方法这样做是为了从 Hibernate 的配置中获取默认架构:

    defaultSchema = config.getProperty("hibernate.default_schema");
    

    config 是我的 org.hibernate.cfg.Configuration 对象。

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 2021-08-26
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多