【发布时间】: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